├── .gitignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── build ├── config └── .gitignore ├── data ├── get-it-on-ego.svg └── screenshot.png ├── meson.build ├── meson_post_install.py ├── po ├── LINGUAS ├── POTFILES.in ├── ca.po ├── cs.po ├── de.po ├── es.po ├── fr.po ├── gl.po ├── he.po ├── it.po ├── lt.po ├── meson.build ├── nb_NO.po ├── nl.po ├── pl.po ├── pt_BR.po ├── ro.po ├── ru.po ├── sk.po ├── sr.po ├── tr.po ├── uk_UA.po ├── zh_CN.po └── zh_TW.po └── src ├── dbus.js ├── extension.js ├── lib.js ├── manager.js ├── meson.build ├── metadata.json ├── mpi-symbolic.svg ├── org.gnome.shell.extensions.mediaplayer.gschema.xml ├── panel.js ├── player.js ├── prefs.js ├── settings.js ├── stylesheet.css ├── ui.js ├── util.js └── widget.js /.gitignore: -------------------------------------------------------------------------------- 1 | builddir/ 2 | *.zip 3 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Community Conduct Guidlines 2 | Much like a good many other opensource projects this is not a democracy. At best it's a meritocracy, at worst it's a dictatorship. At any point you are unhappy with the direction that it's going you are free to fork it and go your own way. 3 | 4 | Oher than that basically just be cool. If you're cool I'll be cool and we're all cool. Cool? Do we really need any other rules? 5 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | Before filing a bug report or feature request please read the [Bug Reports and Feature Requests](https://github.com/JasonLG1979/gnome-shell-extensions-mediaplayer/wiki/Bug-Reports-and-Feature-Requests) wiki page. 4 | 5 | Before you put in a Pull Request please read the [Contributing](https://github.com/JasonLG1979/gnome-shell-extensions-mediaplayer/wiki/Contributing) wiki page. 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | 294 | Copyright (C) 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License along 307 | with this program; if not, write to the Free Software Foundation, Inc., 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) year name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | , 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Lesser General 339 | Public License instead of this License. 340 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # gnome-shell-extensions-mediaplayer 2 | 3 | ## THIS EXTENSION HAS BEEN RETIRED and the repository has been archived. 4 | If you wish to take over maintership please contact [the owner of this repo](https://github.com/JasonLG1979). 5 | 6 | -------------------------------------------------------------------------------- /build: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Possible arguments 4 | #./build --install 5 | #To build and install locally. 6 | 7 | #./build --zip-file 8 | #To build and the zip file. 9 | 10 | BUILD_DIR="builddir" 11 | LOCAL_PREFIX="$HOME/.local" 12 | UUID="mediaplayer@patapon.info" 13 | TMP_DIR="/tmp/share/gnome-shell/extensions/$UUID" 14 | 15 | build_type=$1 16 | if [ -z $build_type ]; then 17 | build_type="--install" 18 | fi 19 | 20 | if [ -d "$PWD/$BUILD_DIR" ]; then 21 | echo "A current build directory already exists. Would you like to remove it?" 22 | select yn in "Yes" "No"; do 23 | case $yn in 24 | Yes ) 25 | rm -rf "$PWD/$BUILD_DIR" 26 | echo "Build directory was removed succesufly" 27 | break;; 28 | No ) 29 | echo "The old build directory must be removed first. Exiting" 30 | exit;; 31 | esac 32 | done 33 | fi 34 | 35 | function build { 36 | prefix=$1 37 | meson $BUILD_DIR --prefix=$prefix 38 | ninja -C $BUILD_DIR install 39 | } 40 | 41 | 42 | case $build_type in 43 | "--install"*) 44 | build $LOCAL_PREFIX 45 | ;; 46 | "--zip-file"*) 47 | build "/tmp" 48 | dest=$PWD 49 | cd $TMP_DIR || exit 50 | zip -rq $dest/$UUID.zip . 51 | if [ -d $TMP_DIR ]; then 52 | rm -rf $TMP_DIR 53 | fi 54 | cd $dest 55 | ;; 56 | esac 57 | if [ -d "$PWD/$BUILD_DIR" ]; then 58 | rm -rf $PWD/$BUILD_DIR 59 | fi 60 | echo "Done" 61 | -------------------------------------------------------------------------------- /config/.gitignore: -------------------------------------------------------------------------------- 1 | install-sh 2 | mkinstalldirs 3 | missing 4 | -------------------------------------------------------------------------------- /data/get-it-on-ego.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /data/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webmastak/gnome-shell-extensions-mediaplayer/b4954f82cf086809a1ab1bed44bf2e38a6313f3f/data/screenshot.png -------------------------------------------------------------------------------- /meson.build: -------------------------------------------------------------------------------- 1 | project('gnome-shell-extensions-mediaplayer', 2 | meson_version: '>= 0.40.0' 3 | ) 4 | 5 | UUID = 'mediaplayer@patapon.info' 6 | EXTENSION_DIR = join_paths(get_option('prefix'), get_option('datadir'), 'gnome-shell/extensions/', UUID) 7 | LOCALE_DIR = join_paths(EXTENSION_DIR, 'locale') 8 | SCHEMA_DIR = join_paths(EXTENSION_DIR, 'schemas') 9 | 10 | subdir('po') 11 | subdir('src') 12 | 13 | meson.add_install_script('meson_post_install.py') 14 | -------------------------------------------------------------------------------- /meson_post_install.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | from os import environ, path 4 | from subprocess import call 5 | 6 | HOME = path.join(path.expanduser('~'), '.local/') 7 | PREFIX = environ.get('MESON_INSTALL_PREFIX', HOME) 8 | DATA_DIR = path.join(PREFIX, 'share') 9 | DEST_DIR = environ.get('DESTDIR', '') 10 | EXTENSION_DIR = path.join(DATA_DIR, 11 | "gnome-shell/extensions/mediaplayer@patapon.info") 12 | 13 | if not DEST_DIR: 14 | print("Installing new Schemas") 15 | call(['glib-compile-schemas', path.join(EXTENSION_DIR, 'schemas/')]) 16 | -------------------------------------------------------------------------------- /po/LINGUAS: -------------------------------------------------------------------------------- 1 | de 2 | es 3 | fr 4 | gl 5 | he 6 | it 7 | lt 8 | nb_NO 9 | nl 10 | pl 11 | pt_BR 12 | ro 13 | ru 14 | sk 15 | sr 16 | tr 17 | uk_UA 18 | zh_CN 19 | zh_TW 20 | -------------------------------------------------------------------------------- /po/POTFILES.in: -------------------------------------------------------------------------------- 1 | src/ui.js 2 | src/settings.js 3 | src/prefs.js 4 | src/org.gnome.shell.extensions.mediaplayer.gschema.xml 5 | -------------------------------------------------------------------------------- /po/ca.po: -------------------------------------------------------------------------------- 1 | # Catalan translation for gnome-shell-extension-mediaplayer. 2 | # Copyright (C) 2019 - gnome-shell-extension-mediaplayer 3 | # This file is distributed under the same license as the 4 | # gnome-shell-extension-mediaplayer package. 5 | # Roig , 2019. 6 | # 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: gnome-shell-extension-mediaplayer\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2015-08-27 18:32+0200\n" 12 | "PO-Revision-Date: 2019-01-15 16:56+0100\n" 13 | "Last-Translator: Roig \n" 14 | "Language-Team: català; valencià <>\n" 15 | "Language: Catalan\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Plural-Forms: nplurals=2; plural=(n > 1);\n" 20 | "X-Generator: Gtranslator 2.91.7\n" 21 | 22 | #: ../src/ui.js:165 23 | msgid "Volume" 24 | msgstr "Volum" 25 | 26 | #: ../src/ui.js:177 27 | msgid "Playlists" 28 | msgstr "Llistes de reproducció" 29 | 30 | #: ../src/settings.js:51 31 | msgid "Stopped" 32 | msgstr "Aturat" 33 | 34 | #: ../src/settings.js:52 35 | msgid "Playing" 36 | msgstr "Reproduint" 37 | 38 | #: ../src/settings.js:53 39 | msgid "Paused" 40 | msgstr "En pausa" 41 | 42 | #: ../src/prefs.js:40 43 | msgid "Indicator position" 44 | msgstr "Indicador de posició" 45 | 46 | #: ../src/prefs.js:42 47 | msgid "Center" 48 | msgstr "Centre" 49 | 50 | #: ../src/prefs.js:43 51 | msgid "Right" 52 | msgstr "Dreta" 53 | 54 | #: ../src/prefs.js:44 55 | msgid "System menu" 56 | msgstr "Menú de sistema" 57 | 58 | #: ../src/prefs.js:49 59 | msgid "Indicator appearance" 60 | msgstr "Aparença" 61 | 62 | #: ../src/prefs.js:51 63 | msgid "Symbolic icon" 64 | msgstr "Icona simbòlica" 65 | 66 | #: ../src/prefs.js:52 67 | msgid "Current album cover" 68 | msgstr "Portada de l'àlbum actual" 69 | 70 | #: ../src/prefs.js:57 71 | msgid "Indicator status text" 72 | msgstr "Text d'estat" 73 | 74 | #: ../src/prefs.js:58 75 | msgid "" 76 | "{trackArtist}: Artist, {trackAlbum}: Album, {trackTitle}: Title. Pango " 77 | "markup supported." 78 | msgstr "%a: Artista, %b: Àlbum, %t: Títol. Compatible amb sintaxis Pango." 79 | 80 | #: ../src/prefs.js:62 81 | msgid "Indicator status text width" 82 | msgstr "Amplada del text indicador d'estat" 83 | 84 | #: ../src/prefs.js:63 85 | msgid "" 86 | "The the maximum width before the status text gets an ellipsis. Default is " 87 | "300px." 88 | msgstr "" 89 | "L'amplada màxima abans del text d'estat provoca una el·lipsis. El valor " 90 | "predeterminat és 300px." 91 | 92 | #: ../src/prefs.js:71 93 | msgid "Allow to start the default media player" 94 | msgstr "Permet obrir el reproductor predeterminat" 95 | 96 | #: ../src/prefs.js:75 97 | msgid "Show the media player volume slider" 98 | msgstr "Mostra el potenciòmetre del volum del reproductor" 99 | 100 | #: ../src/prefs.js:79 101 | msgid "Show the media player position slider" 102 | msgstr "Mostra el control de posició del reproductor" 103 | 104 | #: ../src/prefs.js:83 105 | msgid "Show media player playlists" 106 | msgstr "Mostra les llistes de reproducció" 107 | 108 | #: ../src/prefs.js:87 109 | msgid "Display song rating" 110 | msgstr "Mostra la valoració de la cançó" 111 | 112 | #: ../src/prefs.js:88 113 | msgid "Display the currently playing song's rating on a 0 to 5 scale" 114 | msgstr "Mostra la valoració de la cançó en una escala del 0 al 5" 115 | 116 | #~ msgid "Position in the top panel" 117 | #~ msgstr "Posició en el panell superior" 118 | 119 | #~ msgid "Restart the shell to apply this setting." 120 | #~ msgstr "Cal reiniciar el shell per fer efectius els canvis." 121 | 122 | #~ msgid "Volume menu integration" 123 | #~ msgstr "Integració amb el menú de volum" 124 | 125 | #~ msgid "" 126 | #~ "Runs the default mediaplayer by clicking on the indicator or from the menu" 127 | #~ msgstr "" 128 | #~ "Engega el reproductor predeterminat al clicar sobre l'indicador o des del menú" 129 | 130 | #~ msgid "rating" 131 | #~ msgstr "valoració" 132 | 133 | #~ msgid "by" 134 | #~ msgstr "per" 135 | 136 | #~ msgid "from" 137 | #~ msgstr "de" 138 | 139 | #~ msgid "Unknown Artist" 140 | #~ msgstr "Artista desconegut" 141 | 142 | #~ msgid "Unknown Album" 143 | #~ msgstr "Álbum desconocido" 144 | 145 | #~ msgid "Unknown Title" 146 | #~ msgstr "Título desconegut" 147 | 148 | #~ msgid "Album cover size" 149 | #~ msgstr "Mida de la caràtula de l'àlbum" 150 | 151 | #~ msgid "The size of the cover displayed in the menu. Default is 80px width." 152 | #~ msgstr "Mida de la caràtula mostrada en el menú. Valor predeterminat 80px d'ample" 153 | 154 | #~ msgid "Schema \"%s\" not found." 155 | #~ msgstr "Esquema \"%s\" no trobat." 156 | -------------------------------------------------------------------------------- /po/cs.po: -------------------------------------------------------------------------------- 1 | # Czechh Translation for gnome-shell-extension-mediaplayer package. 2 | # Copyright (C) 2017 gnome-shell-extension-mediaplayer package. 3 | # This file is distributed under the same license as the gnome-shell-extension-mediaplayer package. 4 | # Jan Turoň , 2017. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: gnome-shell-extension-mediaplayer\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2017-11-18 18:13+0200\n" 11 | "PO-Revision-Date: 2017-11-18 18:53+0200\n" 12 | "Last-Translator: Jan Turon , 2012. 5 | # Agilo Kern , 2012. 6 | # 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: gnome-shell-extension-mediaplayer\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2017-07-14 18:13+0200\n" 12 | "PO-Revision-Date: 2017-07-14 18:53+0200\n" 13 | "Last-Translator: Martin Wurm , 2012. 6 | # Cristian Beroiza Rojas , 2013. 7 | # 8 | msgid "" 9 | msgstr "" 10 | "Project-Id-Version: gnome-shell-extension-mediaplayer\n" 11 | "Report-Msgid-Bugs-To: \n" 12 | "POT-Creation-Date: 2015-08-27 18:32+0200\n" 13 | "PO-Revision-Date: 2012-02-25 19:20+0100\n" 14 | "Last-Translator: Cristian Beroiza \n" 15 | "Language-Team: Español;Castellano , \n" 16 | "Language: Spanish\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=utf-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | 21 | #: ../src/ui.js:165 22 | msgid "Volume" 23 | msgstr "Volumen" 24 | 25 | #: ../src/ui.js:177 26 | msgid "Playlists" 27 | msgstr "Listas de reproducción" 28 | 29 | #: ../src/settings.js:51 30 | msgid "Stopped" 31 | msgstr "Detenido" 32 | 33 | #: ../src/settings.js:52 34 | msgid "Playing" 35 | msgstr "Reproduciendo" 36 | 37 | #: ../src/settings.js:53 38 | msgid "Paused" 39 | msgstr "Pausado" 40 | 41 | #: ../src/prefs.js:40 42 | msgid "Indicator position" 43 | msgstr "" 44 | 45 | #: ../src/prefs.js:42 46 | msgid "Center" 47 | msgstr "Centro" 48 | 49 | #: ../src/prefs.js:43 50 | msgid "Right" 51 | msgstr "Derecha" 52 | 53 | #: ../src/prefs.js:44 54 | msgid "System menu" 55 | msgstr "" 56 | 57 | #: ../src/prefs.js:49 58 | #, fuzzy 59 | msgid "Indicator appearance" 60 | msgstr "Apariencia" 61 | 62 | #: ../src/prefs.js:51 63 | msgid "Symbolic icon" 64 | msgstr "Íconos simbólicos" 65 | 66 | #: ../src/prefs.js:52 67 | msgid "Current album cover" 68 | msgstr "Portada del álbum actual" 69 | 70 | #: ../src/prefs.js:57 71 | #, fuzzy 72 | msgid "Indicator status text" 73 | msgstr "Texto de estado" 74 | 75 | #: ../src/prefs.js:58 76 | #, fuzzy 77 | msgid "" 78 | "{trackArtist}: Artist, {trackAlbum}: Album, {trackTitle}: Title. Pango " 79 | "markup supported." 80 | msgstr "%a: Artista, %b: Álbum, %t: Título. Compatible con sintaxis de Pango." 81 | 82 | #: ../src/prefs.js:62 83 | #, fuzzy 84 | msgid "Indicator status text width" 85 | msgstr "Texto de estado" 86 | 87 | #: ../src/prefs.js:63 88 | msgid "" 89 | "The the maximum width before the status text gets an ellipsis. Default is " 90 | "300px." 91 | msgstr "" 92 | 93 | #: ../src/prefs.js:71 94 | msgid "Allow to start the default media player" 95 | msgstr "Permitir el inicio del reproductor multimedia por defecto" 96 | 97 | #: ../src/prefs.js:75 98 | msgid "Show the media player volume slider" 99 | msgstr "Mostrar el ajuste deslizante de volumen del reproductor multimedia" 100 | 101 | #: ../src/prefs.js:79 102 | msgid "Show the media player position slider" 103 | msgstr "Mostrar el ajuste deslizante de posición del reproductor multimedia" 104 | 105 | #: ../src/prefs.js:83 106 | msgid "Show media player playlists" 107 | msgstr "Mostrar las listas de reproducción del reproductor multimedia" 108 | 109 | #: ../src/prefs.js:87 110 | msgid "Display song rating" 111 | msgstr "Mostrar el rating de la canción" 112 | 113 | #: ../src/prefs.js:88 114 | msgid "Display the currently playing song's rating on a 0 to 5 scale" 115 | msgstr "Mostrar el rating en una escala de 0 a 5 de la canción en reproducción" 116 | 117 | #~ msgid "Position in the top panel" 118 | #~ msgstr "Posición en el panel superior" 119 | 120 | #~ msgid "Restart the shell to apply this setting." 121 | #~ msgstr "Reinicie la shell para que los cambios tengan efecto." 122 | 123 | #~ msgid "Volume menu integration" 124 | #~ msgstr "Integración con el menú de volumen" 125 | 126 | #, fuzzy 127 | #~ msgid "" 128 | #~ "Runs the default mediaplayer by clicking on the indicator or from the menu" 129 | #~ msgstr "" 130 | #~ "Iniciar el reproductor multimedia por defecto haciendo click en el " 131 | #~ "indicador" 132 | 133 | #~ msgid "rating" 134 | #~ msgstr "rating" 135 | 136 | #~ msgid "by" 137 | #~ msgstr "por" 138 | 139 | #~ msgid "from" 140 | #~ msgstr "de" 141 | 142 | #~ msgid "Unknown Artist" 143 | #~ msgstr "Artista desconocido" 144 | 145 | #~ msgid "Unknown Album" 146 | #~ msgstr "Álbum desconocido" 147 | 148 | #~ msgid "Unknown Title" 149 | #~ msgstr "Título desconocido" 150 | 151 | #~ msgid "Album cover size" 152 | #~ msgstr "Tamaño de la portada del álbum" 153 | 154 | #~ msgid "The size of the cover displayed in the menu. Default is 80px width." 155 | #~ msgstr "" 156 | #~ "El tamaño de la portada mostrada en el menú. Por defecto son 80px de " 157 | #~ "ancho." 158 | 159 | #~ msgid "Schema \"%s\" not found." 160 | #~ msgstr "Esquema \"%s\" no encontrado." 161 | -------------------------------------------------------------------------------- /po/fr.po: -------------------------------------------------------------------------------- 1 | msgid "" 2 | msgstr "" 3 | "Project-Id-Version: gnome-shell-extension-mediaplayer\n" 4 | "Report-Msgid-Bugs-To: \n" 5 | "POT-Creation-Date: 2015-08-27 18:32+0200\n" 6 | "PO-Revision-Date: 2012-11-13 11:05+0100\n" 7 | "Last-Translator: Sébastien Maccagnoni-Munch \n" 8 | "Language-Team: Jean-Philippe Braun \n" 9 | "Language: French\n" 10 | "MIME-Version: 1.0\n" 11 | "Content-Type: text/plain; charset=utf-8\n" 12 | "Content-Transfer-Encoding: 8bit\n" 13 | 14 | #: ../src/ui.js:165 15 | msgid "Volume" 16 | msgstr "Volume" 17 | 18 | #: ../src/ui.js:177 19 | msgid "Playlists" 20 | msgstr "Listes de lecture" 21 | 22 | #: ../src/settings.js:51 23 | msgid "Stopped" 24 | msgstr "Arrêté" 25 | 26 | #: ../src/settings.js:52 27 | msgid "Playing" 28 | msgstr "Lecture en cours" 29 | 30 | #: ../src/settings.js:53 31 | msgid "Paused" 32 | msgstr "En pause" 33 | 34 | #: ../src/prefs.js:40 35 | msgid "Indicator position" 36 | msgstr "Position de l'indicateur" 37 | 38 | #: ../src/prefs.js:42 39 | msgid "Center" 40 | msgstr "Au centre" 41 | 42 | #: ../src/prefs.js:43 43 | msgid "Right" 44 | msgstr "À droite" 45 | 46 | #: ../src/prefs.js:44 47 | msgid "System menu" 48 | msgstr "Dans le menu système" 49 | 50 | #: ../src/prefs.js:49 51 | msgid "Indicator appearance" 52 | msgstr "Apparence de l'indicateur" 53 | 54 | #: ../src/prefs.js:51 55 | msgid "Symbolic icon" 56 | msgstr "Icône symbolique" 57 | 58 | #: ../src/prefs.js:52 59 | msgid "Current album cover" 60 | msgstr "Pochette de l'album" 61 | 62 | #: ../src/prefs.js:57 63 | msgid "Indicator status text" 64 | msgstr "Texte de statut de l'indicateur" 65 | 66 | #: ../src/prefs.js:58 67 | msgid "" 68 | "{trackArtist}: Artist, {trackAlbum}: Album, {trackTitle}: Title. Pango " 69 | "markup supported." 70 | msgstr "" 71 | "{trackArtist}: Artiste, {trackAlbum}: Album, {trackTitle}: Titre. Formattage " 72 | "Pango supporté." 73 | 74 | #: ../src/prefs.js:62 75 | msgid "Indicator status text width" 76 | msgstr "Taille du texte de statut" 77 | 78 | #: ../src/prefs.js:63 79 | msgid "" 80 | "The the maximum width before the status text gets an ellipsis. Default is " 81 | "300px." 82 | msgstr "" 83 | "La taille maximale que peut prendre le texte de statut avant d'être tronqué. " 84 | "300px par défaut." 85 | 86 | #: ../src/prefs.js:71 87 | msgid "Allow to start the default media player" 88 | msgstr "Permettre le lancement du lecteur multimédia par défaut" 89 | 90 | #: ../src/prefs.js:75 91 | msgid "Show the media player volume slider" 92 | msgstr "Afficher le controle du volume du lecteur multimédia" 93 | 94 | #: ../src/prefs.js:79 95 | msgid "Show the media player position slider" 96 | msgstr "Afficher la barre de progression du lecteur multimédia" 97 | 98 | #: ../src/prefs.js:83 99 | msgid "Show media player playlists" 100 | msgstr "Afficher les listes de lecture du lecteur multimédia" 101 | 102 | #: ../src/prefs.js:87 103 | msgid "Display song rating" 104 | msgstr "Afficher la note de la chanson" 105 | 106 | #: ../src/prefs.js:88 107 | msgid "Display the currently playing song's rating on a 0 to 5 scale" 108 | msgstr "Afficher la note de la chanson en lecture sur une échelle de 0 à 5" 109 | -------------------------------------------------------------------------------- /po/gl.po: -------------------------------------------------------------------------------- 1 | # Galician translations for PACKAGE package. 2 | # Copyright (C) 2011 THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # Fran Dieguez , 2011, 2013. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: gnome-shell-extension-mediaplayer\n" 8 | "Report-Msgid-Bugs-To: \n" 9 | "POT-Creation-Date: 2015-08-27 18:32+0200\n" 10 | "PO-Revision-Date: 2013-10-10 12:36+0200\n" 11 | "Last-Translator: Fran Dieguez \n" 12 | "Language-Team: gnome-l10n-gl@gnome.org\n" 13 | "Language: gl\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 18 | "X-Generator: Virtaal 0.7.1\n" 19 | "X-Project-Style: gnome\n" 20 | 21 | #: ../src/ui.js:165 22 | msgid "Volume" 23 | msgstr "" 24 | 25 | #: ../src/ui.js:177 26 | msgid "Playlists" 27 | msgstr "" 28 | 29 | #: ../src/settings.js:51 30 | msgid "Stopped" 31 | msgstr "" 32 | 33 | #: ../src/settings.js:52 34 | msgid "Playing" 35 | msgstr "" 36 | 37 | #: ../src/settings.js:53 38 | msgid "Paused" 39 | msgstr "" 40 | 41 | #: ../src/prefs.js:40 42 | msgid "Indicator position" 43 | msgstr "" 44 | 45 | #: ../src/prefs.js:42 46 | msgid "Center" 47 | msgstr "Centrado" 48 | 49 | #: ../src/prefs.js:43 50 | msgid "Right" 51 | msgstr "Dereita" 52 | 53 | #: ../src/prefs.js:44 54 | msgid "System menu" 55 | msgstr "" 56 | 57 | #: ../src/prefs.js:49 58 | #, fuzzy 59 | msgid "Indicator appearance" 60 | msgstr "Aparencia" 61 | 62 | #: ../src/prefs.js:51 63 | msgid "Symbolic icon" 64 | msgstr "Icona simbólica" 65 | 66 | #: ../src/prefs.js:52 67 | msgid "Current album cover" 68 | msgstr "Carátula do álbum actual" 69 | 70 | #: ../src/prefs.js:57 71 | #, fuzzy 72 | msgid "Indicator status text" 73 | msgstr "Texto de estado" 74 | 75 | #: ../src/prefs.js:58 76 | #, fuzzy 77 | msgid "" 78 | "{trackArtist}: Artist, {trackAlbum}: Album, {trackTitle}: Title. Pango " 79 | "markup supported." 80 | msgstr "%a: Artista, %b: Álbum, %t: Título. Admítese marcado Pango." 81 | 82 | #: ../src/prefs.js:62 83 | #, fuzzy 84 | msgid "Indicator status text width" 85 | msgstr "Texto de estado" 86 | 87 | #: ../src/prefs.js:63 88 | msgid "" 89 | "The the maximum width before the status text gets an ellipsis. Default is " 90 | "300px." 91 | msgstr "" 92 | 93 | #: ../src/prefs.js:71 94 | msgid "Allow to start the default media player" 95 | msgstr "Permitir iniciar o reprodutor multimedia predeterminado" 96 | 97 | #: ../src/prefs.js:75 98 | msgid "Show the media player volume slider" 99 | msgstr "Mostrar o regulador de volume do reprodutor multimedia" 100 | 101 | #: ../src/prefs.js:79 102 | msgid "Show the media player position slider" 103 | msgstr "Mostrar o regulador de posición do reprodutor multimedia" 104 | 105 | #: ../src/prefs.js:83 106 | msgid "Show media player playlists" 107 | msgstr "Mostrar as listas de reprodución do reprodutor" 108 | 109 | #: ../src/prefs.js:87 110 | msgid "Display song rating" 111 | msgstr "Mostrar cualificacións de cancións" 112 | 113 | #: ../src/prefs.js:88 114 | msgid "Display the currently playing song's rating on a 0 to 5 scale" 115 | msgstr "" 116 | "Mostrar a cualificación da canción en reprodución nunha escala de 0 a 5" 117 | 118 | #~ msgid "Position in the top panel" 119 | #~ msgstr "Posición no panel superior" 120 | 121 | #~ msgid "Restart the shell to apply this setting." 122 | #~ msgstr "Reinicie o shell para aplicar esta configuración." 123 | 124 | #~ msgid "Volume menu integration" 125 | #~ msgstr "Integración do menú de son" 126 | 127 | #~ msgid "" 128 | #~ "Runs the default mediaplayer by clicking on the indicator or from the menu" 129 | #~ msgstr "" 130 | #~ "Executa o reprodutor multimedia predeterminado ao premer no indicador ou " 131 | #~ "no menú" 132 | 133 | #~ msgid "Album cover size" 134 | #~ msgstr "Tamaño da carátula do álbum" 135 | 136 | #~ msgid "The size of the cover displayed in the menu. Default is 80px width." 137 | #~ msgstr "" 138 | #~ "O tamaño da carátula do álbum mostrada no menú. Por omisión é 80px de " 139 | #~ "ancho." 140 | -------------------------------------------------------------------------------- /po/he.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # Matanya Moses , 2014. 6 | # 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: gnome-shell-extension-mediaplayer\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2015-08-27 18:32+0200\n" 12 | "PO-Revision-Date: 2014-04-24 00:42+0300\n" 13 | "Last-Translator: Matanya Moses \n" 14 | "Language-Team: עברית <>\n" 15 | "Language: Hebrew\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 20 | "X-Generator: Gtranslator 2.91.6\n" 21 | 22 | #: ../src/ui.js:165 23 | msgid "Volume" 24 | msgstr "עוצמת קול" 25 | 26 | #: ../src/ui.js:177 27 | msgid "Playlists" 28 | msgstr "רשימות השמעה" 29 | 30 | #: ../src/settings.js:51 31 | msgid "Stopped" 32 | msgstr "נעצר" 33 | 34 | #: ../src/settings.js:52 35 | msgid "Playing" 36 | msgstr "מתנגן" 37 | 38 | #: ../src/settings.js:53 39 | msgid "Paused" 40 | msgstr "הושהה" 41 | 42 | #: ../src/prefs.js:40 43 | msgid "Indicator position" 44 | msgstr "" 45 | 46 | #: ../src/prefs.js:42 47 | msgid "Center" 48 | msgstr "מרכז" 49 | 50 | #: ../src/prefs.js:43 51 | msgid "Right" 52 | msgstr "ימין" 53 | 54 | #: ../src/prefs.js:44 55 | msgid "System menu" 56 | msgstr "" 57 | 58 | #: ../src/prefs.js:49 59 | #, fuzzy 60 | msgid "Indicator appearance" 61 | msgstr "מראה" 62 | 63 | #: ../src/prefs.js:51 64 | msgid "Symbolic icon" 65 | msgstr "סמליל מייצג" 66 | 67 | #: ../src/prefs.js:52 68 | msgid "Current album cover" 69 | msgstr "עטיפת אלבום נוכחי" 70 | 71 | #: ../src/prefs.js:57 72 | #, fuzzy 73 | msgid "Indicator status text" 74 | msgstr "טקסט המצב" 75 | 76 | #: ../src/prefs.js:58 77 | #, fuzzy 78 | msgid "" 79 | "{trackArtist}: Artist, {trackAlbum}: Album, {trackTitle}: Title. Pango " 80 | "markup supported." 81 | msgstr "%a: אמן, %b: אלבום, %t: כותר. תחביר Pango נתמך." 82 | 83 | #: ../src/prefs.js:62 84 | #, fuzzy 85 | msgid "Indicator status text width" 86 | msgstr "טקסט המצב" 87 | 88 | #: ../src/prefs.js:63 89 | msgid "" 90 | "The the maximum width before the status text gets an ellipsis. Default is " 91 | "300px." 92 | msgstr "" 93 | 94 | #: ../src/prefs.js:71 95 | msgid "Allow to start the default media player" 96 | msgstr "אפשרות להפעיל את נגן ברירת המחדל של המערכת" 97 | 98 | #: ../src/prefs.js:75 99 | msgid "Show the media player volume slider" 100 | msgstr "הצגת בורר השמע של נגן המדיה" 101 | 102 | #: ../src/prefs.js:79 103 | msgid "Show the media player position slider" 104 | msgstr "הצגת בורר מיקום השיר של נגן המדיה" 105 | 106 | #: ../src/prefs.js:83 107 | msgid "Show media player playlists" 108 | msgstr "הצגת רשימות ההשמעה של נגן המדיה" 109 | 110 | #: ../src/prefs.js:87 111 | msgid "Display song rating" 112 | msgstr "הצגת דירוג השיר" 113 | 114 | #: ../src/prefs.js:88 115 | msgid "Display the currently playing song's rating on a 0 to 5 scale" 116 | msgstr "הצגת דירוג השיר המתנגן בסקלה של 0 עד 5" 117 | 118 | #~ msgid "Position in the top panel" 119 | #~ msgstr "מיקום בסרגל העליון" 120 | 121 | #~ msgid "Restart the shell to apply this setting." 122 | #~ msgstr "יש לאתחל את המעטפת על מנת להחיל את השינויים" 123 | 124 | #~ msgid "Volume menu integration" 125 | #~ msgstr "שילוב בתפריט השמע" 126 | 127 | #, fuzzy 128 | #~ msgid "" 129 | #~ "Runs the default mediaplayer by clicking on the indicator or from the menu" 130 | #~ msgstr "מפעיל את נגן ברירת המחדל בלחיצה על הסמן" 131 | 132 | #~ msgid "rating" 133 | #~ msgstr "דירוג" 134 | 135 | #~ msgid "by" 136 | #~ msgstr "על ידי" 137 | 138 | #~ msgid "from" 139 | #~ msgstr "מאת" 140 | 141 | #~ msgid "Unknown Artist" 142 | #~ msgstr "אומן לא ידוע" 143 | 144 | #~ msgid "Unknown Album" 145 | #~ msgstr "אלבום לא ידוע" 146 | 147 | #~ msgid "Unknown Title" 148 | #~ msgstr "שיר לא ידוע" 149 | 150 | #~ msgid "Album cover size" 151 | #~ msgstr "גודל עטיפת האלבום" 152 | 153 | #~ msgid "The size of the cover displayed in the menu. Default is 80px width." 154 | #~ msgstr "גודל האלבום המוצג בתפריט. ברירת המחדל היא רוחב 80px" 155 | -------------------------------------------------------------------------------- /po/it.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: \n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2015-08-27 18:32+0200\n" 11 | "PO-Revision-Date: 2017-04-17 15:47+0200\n" 12 | "Last-Translator: Giuseppe Pignataro (Fastbyte01) \n" 13 | "Language: it\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Language-Team: \n" 18 | "X-Generator: Poedit 2.0.1\n" 19 | 20 | #: ../src/ui.js:165 21 | msgid "Volume" 22 | msgstr "Volume" 23 | 24 | #: ../src/ui.js:177 25 | msgid "Playlists" 26 | msgstr "Playlist" 27 | 28 | #: ../src/settings.js:51 29 | msgid "Stopped" 30 | msgstr "Fermato" 31 | 32 | #: ../src/settings.js:52 33 | msgid "Playing" 34 | msgstr "In Riproduzione" 35 | 36 | #: ../src/settings.js:53 37 | msgid "Paused" 38 | msgstr "In Pausa" 39 | 40 | #: ../src/prefs.js:40 41 | msgid "Indicator position" 42 | msgstr "Posizione indicatore" 43 | 44 | #: ../src/prefs.js:42 45 | msgid "Center" 46 | msgstr "Centro" 47 | 48 | #: ../src/prefs.js:43 49 | msgid "Right" 50 | msgstr "Destra" 51 | 52 | #: ../src/prefs.js:44 53 | msgid "System menu" 54 | msgstr "Menu di sistema" 55 | 56 | #: ../src/prefs.js:49 57 | msgid "Indicator appearance" 58 | msgstr "Aspetto indicatore" 59 | 60 | #: ../src/prefs.js:51 61 | msgid "Symbolic icon" 62 | msgstr "Icona simbolica" 63 | 64 | #: ../src/prefs.js:52 65 | msgid "Current album cover" 66 | msgstr "Copertina album corrente" 67 | 68 | #: ../src/prefs.js:57 69 | msgid "Indicator status text" 70 | msgstr "Testo indicatore di stato" 71 | 72 | #: ../src/prefs.js:58 73 | msgid "" 74 | "{trackArtist}: Artist, {trackAlbum}: Album, {trackTitle}: Title. Pango " 75 | "markup supported." 76 | msgstr "" 77 | "{trackArtist}: Artista, {trackAlbum}: Album, {trackTitle}: Titolo. Markup " 78 | "Pango supportato." 79 | 80 | #: ../src/prefs.js:62 81 | msgid "Indicator status text width" 82 | msgstr "Larghezza testo indicatore di stato" 83 | 84 | #: ../src/prefs.js:63 85 | msgid "" 86 | "The the maximum width before the status text gets an ellipsis. Default is " 87 | "300px." 88 | msgstr "" 89 | "La larghezza massima prima che il testo dello stato diventino dei " 90 | "puntini. Default è 300px." 91 | 92 | #: ../src/prefs.js:71 93 | msgid "Allow to start the default media player" 94 | msgstr "Permette di avviare il media player di default" 95 | 96 | #: ../src/prefs.js:75 97 | msgid "Show the media player volume slider" 98 | msgstr "Mostra il cursore del volume del media player" 99 | 100 | #: ../src/prefs.js:79 101 | msgid "Show the media player position slider" 102 | msgstr "Mostra la posizione del cursore del media player" 103 | 104 | #: ../src/prefs.js:83 105 | msgid "Show media player playlists" 106 | msgstr "Mostra le playlist del media player" 107 | 108 | #: ../src/prefs.js:87 109 | msgid "Display song rating" 110 | msgstr "Mostra il voto della canzone" 111 | 112 | #: ../src/prefs.js:88 113 | msgid "Display the currently playing song's rating on a 0 to 5 scale" 114 | msgstr "" 115 | "Mostra il voto della canzone attualmente in esecuzione su una scala da 0 " 116 | "a 5" 117 | 118 | #~ msgid "by" 119 | #~ msgstr "di" 120 | 121 | #~ msgid "from" 122 | #~ msgstr "da" 123 | 124 | #~ msgid "Unknown Artist" 125 | #~ msgstr "Artista Sconosciuto" 126 | 127 | #~ msgid "Unknown Album" 128 | #~ msgstr "Album Sconosciuto" 129 | 130 | #~ msgid "Unknown Title" 131 | #~ msgstr "Titolo Sconosciuto" 132 | 133 | #~ msgid "Schema \"%s\" not found." 134 | #~ msgstr "Schema \"%s\" non trovato." 135 | -------------------------------------------------------------------------------- /po/lt.po: -------------------------------------------------------------------------------- 1 | msgid "" 2 | msgstr "" 3 | "Project-Id-Version: gnome-shell-extension-mediaplayer\n" 4 | "Report-Msgid-Bugs-To: \n" 5 | "POT-Creation-Date: 2015-08-27 18:32+0200\n" 6 | "PO-Revision-Date: 2011-10-31 15:10+0200\n" 7 | "Last-Translator: Mantas Mikulėnas \n" 8 | "Language-Team: Mantas Mikulėnas \n" 9 | "Language: lt\n" 10 | "MIME-Version: 1.0\n" 11 | "Content-Type: text/plain; charset=utf-8\n" 12 | "Content-Transfer-Encoding: 8bit\n" 13 | 14 | #: ../src/ui.js:165 15 | msgid "Volume" 16 | msgstr "Garsumas" 17 | 18 | #: ../src/ui.js:177 19 | #, fuzzy 20 | msgid "Playlists" 21 | msgstr "Atkuriama" 22 | 23 | #: ../src/settings.js:51 24 | msgid "Stopped" 25 | msgstr "Sustabdyta" 26 | 27 | #: ../src/settings.js:52 28 | msgid "Playing" 29 | msgstr "Atkuriama" 30 | 31 | #: ../src/settings.js:53 32 | msgid "Paused" 33 | msgstr "Pristabdyta" 34 | 35 | #: ../src/prefs.js:40 36 | msgid "Indicator position" 37 | msgstr "" 38 | 39 | #: ../src/prefs.js:42 40 | msgid "Center" 41 | msgstr "" 42 | 43 | #: ../src/prefs.js:43 44 | msgid "Right" 45 | msgstr "" 46 | 47 | #: ../src/prefs.js:44 48 | msgid "System menu" 49 | msgstr "" 50 | 51 | #: ../src/prefs.js:49 52 | msgid "Indicator appearance" 53 | msgstr "" 54 | 55 | #: ../src/prefs.js:51 56 | msgid "Symbolic icon" 57 | msgstr "" 58 | 59 | #: ../src/prefs.js:52 60 | msgid "Current album cover" 61 | msgstr "" 62 | 63 | #: ../src/prefs.js:57 64 | msgid "Indicator status text" 65 | msgstr "" 66 | 67 | #: ../src/prefs.js:58 68 | msgid "" 69 | "{trackArtist}: Artist, {trackAlbum}: Album, {trackTitle}: Title. Pango " 70 | "markup supported." 71 | msgstr "" 72 | 73 | #: ../src/prefs.js:62 74 | msgid "Indicator status text width" 75 | msgstr "" 76 | 77 | #: ../src/prefs.js:63 78 | msgid "" 79 | "The the maximum width before the status text gets an ellipsis. Default is " 80 | "300px." 81 | msgstr "" 82 | 83 | #: ../src/prefs.js:71 84 | msgid "Allow to start the default media player" 85 | msgstr "" 86 | 87 | #: ../src/prefs.js:75 88 | #, fuzzy 89 | msgid "Show the media player volume slider" 90 | msgstr "Atkuriama" 91 | 92 | #: ../src/prefs.js:79 93 | #, fuzzy 94 | msgid "Show the media player position slider" 95 | msgstr "Atkuriama" 96 | 97 | #: ../src/prefs.js:83 98 | #, fuzzy 99 | msgid "Show media player playlists" 100 | msgstr "Atkuriama" 101 | 102 | #: ../src/prefs.js:87 103 | msgid "Display song rating" 104 | msgstr "" 105 | 106 | #: ../src/prefs.js:88 107 | msgid "Display the currently playing song's rating on a 0 to 5 scale" 108 | msgstr "" 109 | 110 | #~ msgid "Unknown Artist" 111 | #~ msgstr "Nežinomas atlikėjas" 112 | 113 | #~ msgid "Unknown Album" 114 | #~ msgstr "Nežinomas albumas" 115 | 116 | #~ msgid "Unknown Title" 117 | #~ msgstr "Nežinomas pavadinimas" 118 | -------------------------------------------------------------------------------- /po/meson.build: -------------------------------------------------------------------------------- 1 | i18n = import('i18n') 2 | i18n.gettext(meson.project_name(), preset: 'glib') 3 | -------------------------------------------------------------------------------- /po/nb_NO.po: -------------------------------------------------------------------------------- 1 | # Norwegian Bokmål Translation for gnome-shell-extension-mediaplayer package. 2 | # Copyright (C) 2017 gnome-shell-extension-mediaplayer package. 3 | # This file is distributed under the same license as the gnome-shell-extension-mediaplayer package. 4 | # Lars Andre Landås , 2017. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: gnome-shell-extension-mediaplayer\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2017-03-29 01:30+0100\n" 11 | "PO-Revision-Date: 2017-03-29 01:30+0100\n" 12 | "Last-Translator: Lars Andre Landås \n" 13 | "Language: nb_NO\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=utf-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Language-Team: \n" 18 | 19 | #: ../src/ui.js:165 20 | msgid "Volume" 21 | msgstr "Volum" 22 | 23 | #: ../src/ui.js:177 24 | msgid "Playlists" 25 | msgstr "Spilleliste" 26 | 27 | #: ../src/settings.js:51 28 | msgid "Stopped" 29 | msgstr "Stoppet" 30 | 31 | #: ../src/settings.js:52 32 | msgid "Playing" 33 | msgstr "Spiller" 34 | 35 | #: ../src/settings.js:53 36 | msgid "Paused" 37 | msgstr "Pauset" 38 | 39 | #: ../src/prefs.js:40 40 | msgid "Indicator position" 41 | msgstr "Indikatorposisjon" 42 | 43 | #: ../src/prefs.js:42 44 | msgid "Center" 45 | msgstr "Midten" 46 | 47 | #: ../src/prefs.js:43 48 | msgid "Right" 49 | msgstr "Høyre" 50 | 51 | #: ../src/prefs.js:44 52 | msgid "System menu" 53 | msgstr "System-meny" 54 | 55 | #: ../src/prefs.js:49 56 | msgid "Indicator appearance" 57 | msgstr "Indikatorutseende" 58 | 59 | #: ../src/prefs.js:51 60 | msgid "Symbolic icon" 61 | msgstr "Symbolikon" 62 | 63 | #: ../src/prefs.js:52 64 | msgid "Current album cover" 65 | msgstr "Spillende albumomslag" 66 | 67 | #: ../src/prefs.js:57 68 | msgid "Indicator status text" 69 | msgstr "Statustekst på indikator" 70 | 71 | #: ../src/prefs.js:58 72 | msgid "{trackArtist}: Artist, {trackAlbum}: Album, {trackTitle}: Title. Pango markup supported." 73 | msgstr "" 74 | "{trackArtist}: Artist, {trackAlbum}: Album, {trackTitle}: Tittel. Pango markup er støttet." 75 | "unterstützt." 76 | 77 | #: ../src/prefs.js:62 78 | msgid "Indicator status text width" 79 | msgstr "Bredde på statustekst på indikator" 80 | 81 | #: ../src/prefs.js:63 82 | msgid "The the maximum width before the status text gets an ellipsis. Default is 300px." 83 | msgstr "Maksbredde på statustekst før ellipsen. Standard er 300px." 84 | 85 | #: ../src/prefs.js:71 86 | msgid "Allow to start the default media player" 87 | msgstr "Tillat å starte standard medieavspiller" 88 | 89 | #: ../src/prefs.js:75 90 | msgid "Show the media player volume slider" 91 | msgstr "Vis medieavspillerens volumkontroller" 92 | 93 | #: ../src/prefs.js:79 94 | msgid "Show the media player position slider" 95 | msgstr "Vis medieavspillerens posisjonskontroller" 96 | 97 | #: ../src/prefs.js:83 98 | msgid "Show media player playlists" 99 | msgstr "Vis medieavspilleren spilleliste" 100 | 101 | #: ../src/prefs.js:87 102 | msgid "Display song rating" 103 | msgstr "Vis sangenes popularitet" 104 | 105 | #: ../src/prefs.js:88 106 | msgid "Display the currently playing song's rating on a 0 to 5 scale" 107 | msgstr "Vis nåværende sangs popularitet på en skala fra 0 til 5" 108 | 109 | #~ msgid "Position in the top panel" 110 | #~ msgstr "Posisjon i paneltopp" 111 | 112 | #~ msgid "Restart the shell to apply this setting." 113 | #~ msgstr "Gnome shell trenger en omstart for å endre innstilling." 114 | 115 | #~ msgid "Volume menu integration" 116 | #~ msgstr "Integrer lydnivåmeny" 117 | 118 | #, fuzzy 119 | #~ msgid "Runs the default mediaplayer by clicking on the indicator or from the menu" 120 | #~ msgstr "Starter standard medieavspiller når du klikker på indikatoren eller fra menyen" 121 | 122 | #~ msgid "rating" 123 | #~ msgstr "popularitet" 124 | 125 | #~ msgid "by" 126 | #~ msgstr "av" 127 | 128 | #~ msgid "from" 129 | #~ msgstr "fra" 130 | 131 | #~ msgid "Unknown Artist" 132 | #~ msgstr "Ukjent artist" 133 | 134 | #~ msgid "Unknown Album" 135 | #~ msgstr "Ukjent album" 136 | 137 | #~ msgid "Unknown Title" 138 | #~ msgstr "Ukjent tittel" 139 | 140 | #~ msgid "Album cover size" 141 | #~ msgstr "Størrelse på albumomslag" 142 | 143 | #~ msgid "The size of the cover displayed in the menu. Default is 80px width." 144 | #~ msgstr "Størrelse på albumomslaget som vises i menyen. Standard er bredde på 80px." 145 | 146 | #~ msgid "Show the media player in the volume menu" 147 | #~ msgstr "Vis medieavspillerem i lydnivåmeny" 148 | -------------------------------------------------------------------------------- /po/nl.po: -------------------------------------------------------------------------------- 1 | # German Translation for gnome-shell-extension-mediaplayer package. 2 | # Copyright (C) 2012 gnome-shell-extension-mediaplayer package. 3 | # This file is distributed under the same license as the gnome-shell-extension-mediaplayer package. 4 | # Frederik Hahne , 2012. 5 | # Agilo Kern , 2012. 6 | # 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: gnome-shell-extension-mediaplayer\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2015-08-27 18:32+0200\n" 12 | "PO-Revision-Date: 2013-04-03 20:47+0100\n" 13 | "Last-Translator: Heimen Stoffels \n" 14 | "Language-Team: VDTT \n" 15 | "Language: Dutch\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "X-Generator: Poedit 1.5.4\n" 20 | 21 | #: ../src/ui.js:165 22 | msgid "Volume" 23 | msgstr "Volume" 24 | 25 | #: ../src/ui.js:177 26 | msgid "Playlists" 27 | msgstr "Afspeellijsten" 28 | 29 | #: ../src/settings.js:51 30 | msgid "Stopped" 31 | msgstr "Gestopt" 32 | 33 | #: ../src/settings.js:52 34 | msgid "Playing" 35 | msgstr "Bezig met afspelen" 36 | 37 | #: ../src/settings.js:53 38 | msgid "Paused" 39 | msgstr "Gepauzeerd" 40 | 41 | #: ../src/prefs.js:40 42 | msgid "Indicator position" 43 | msgstr "" 44 | 45 | #: ../src/prefs.js:42 46 | msgid "Center" 47 | msgstr "Midden" 48 | 49 | #: ../src/prefs.js:43 50 | msgid "Right" 51 | msgstr "Rechts" 52 | 53 | #: ../src/prefs.js:44 54 | msgid "System menu" 55 | msgstr "" 56 | 57 | #: ../src/prefs.js:49 58 | #, fuzzy 59 | msgid "Indicator appearance" 60 | msgstr "Uiterlijk" 61 | 62 | #: ../src/prefs.js:51 63 | msgid "Symbolic icon" 64 | msgstr "Symbolisch pictogram" 65 | 66 | #: ../src/prefs.js:52 67 | msgid "Current album cover" 68 | msgstr "Huidige albumhoes" 69 | 70 | #: ../src/prefs.js:57 71 | #, fuzzy 72 | msgid "Indicator status text" 73 | msgstr "Statustekst" 74 | 75 | #: ../src/prefs.js:58 76 | #, fuzzy 77 | msgid "" 78 | "{trackArtist}: Artist, {trackAlbum}: Album, {trackTitle}: Title. Pango " 79 | "markup supported." 80 | msgstr "%a: Artiest, %b: Album, %t: Titel. Pango-opmaak wordt ondersteund." 81 | 82 | #: ../src/prefs.js:62 83 | #, fuzzy 84 | msgid "Indicator status text width" 85 | msgstr "Statustekst" 86 | 87 | #: ../src/prefs.js:63 88 | msgid "" 89 | "The the maximum width before the status text gets an ellipsis. Default is " 90 | "300px." 91 | msgstr "" 92 | 93 | #: ../src/prefs.js:71 94 | msgid "Allow to start the default media player" 95 | msgstr "Sta toe om de standaard mediaspeler te starten" 96 | 97 | #: ../src/prefs.js:75 98 | msgid "Show the media player volume slider" 99 | msgstr "Toon de volumeschuif van de mediaspeler" 100 | 101 | #: ../src/prefs.js:79 102 | msgid "Show the media player position slider" 103 | msgstr "Toon de positieschuif van de mediaspeler" 104 | 105 | #: ../src/prefs.js:83 106 | msgid "Show media player playlists" 107 | msgstr "Toon de afspeellijsten van de mediaspeler" 108 | 109 | #: ../src/prefs.js:87 110 | msgid "Display song rating" 111 | msgstr "Toon nummerwaardering" 112 | 113 | #: ../src/prefs.js:88 114 | msgid "Display the currently playing song's rating on a 0 to 5 scale" 115 | msgstr "" 116 | "Toon de waardering van het huidige afspelende nummer op een schaal van 0 tot " 117 | "5" 118 | 119 | #~ msgid "Position in the top panel" 120 | #~ msgstr "Locate op paneel" 121 | 122 | #~ msgid "Restart the shell to apply this setting." 123 | #~ msgstr "Herstart Shell om deze instellingen toe te passen." 124 | 125 | #~ msgid "Volume menu integration" 126 | #~ msgstr "Geïntegreerd in volumemenu" 127 | 128 | #, fuzzy 129 | #~ msgid "" 130 | #~ "Runs the default mediaplayer by clicking on the indicator or from the menu" 131 | #~ msgstr "Start de standaard mediaspeler door te klikken op de indicator" 132 | 133 | #~ msgid "rating" 134 | #~ msgstr "waardering" 135 | 136 | #~ msgid "by" 137 | #~ msgstr "door" 138 | 139 | #~ msgid "from" 140 | #~ msgstr "van" 141 | 142 | #~ msgid "Unknown Artist" 143 | #~ msgstr "Onbekende artiest" 144 | 145 | #~ msgid "Unknown Album" 146 | #~ msgstr "Onbekend album" 147 | 148 | #~ msgid "Unknown Title" 149 | #~ msgstr "Onbekende titel" 150 | 151 | #~ msgid "Album cover size" 152 | #~ msgstr "Grootte van albumhoes" 153 | 154 | #~ msgid "The size of the cover displayed in the menu. Default is 80px width." 155 | #~ msgstr "" 156 | #~ "De grootte van de getoonde hoes in het menu. Standaardwaarde is 80px " 157 | #~ "breed." 158 | 159 | #~ msgid "Show the media player in the volume menu" 160 | #~ msgstr "Mediaplayer im Lautstärkemenü anzeigen" 161 | -------------------------------------------------------------------------------- /po/pl.po: -------------------------------------------------------------------------------- 1 | # Polish translation for gnome-shell-extension-mediaplayer. 2 | # Copyright (C) 2011 THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the gnome-shell-extension-mediaplayer package. 4 | # Piotr Sokół , 2011, 2012. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: gnome-shell-extension-mediaplayer\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2015-08-27 18:32+0200\n" 11 | "PO-Revision-Date: 2012-04-08 11:54+0200\n" 12 | "Last-Translator: Piotr Sokół \n" 13 | "Language-Team: polski <>\n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bits\n" 18 | "Plural-Forms: nplurals=3; plural=((n==1) ? 0 : ((n%10>=2 && n%10<=4 && (n" 19 | "%100<10 || n%100>=20)) ? 1 : 2));\n" 20 | 21 | #: ../src/ui.js:165 22 | msgid "Volume" 23 | msgstr "Głośność" 24 | 25 | #: ../src/ui.js:177 26 | msgid "Playlists" 27 | msgstr "Listy odtwarzania" 28 | 29 | #: ../src/settings.js:51 30 | msgid "Stopped" 31 | msgstr "Zatrzymano" 32 | 33 | #: ../src/settings.js:52 34 | msgid "Playing" 35 | msgstr "Odtwarzanie" 36 | 37 | #: ../src/settings.js:53 38 | msgid "Paused" 39 | msgstr "Wstrzymano" 40 | 41 | #: ../src/prefs.js:40 42 | msgid "Indicator position" 43 | msgstr "" 44 | 45 | #: ../src/prefs.js:42 46 | msgid "Center" 47 | msgstr "" 48 | 49 | #: ../src/prefs.js:43 50 | msgid "Right" 51 | msgstr "" 52 | 53 | #: ../src/prefs.js:44 54 | msgid "System menu" 55 | msgstr "" 56 | 57 | #: ../src/prefs.js:49 58 | msgid "Indicator appearance" 59 | msgstr "" 60 | 61 | #: ../src/prefs.js:51 62 | msgid "Symbolic icon" 63 | msgstr "" 64 | 65 | #: ../src/prefs.js:52 66 | msgid "Current album cover" 67 | msgstr "" 68 | 69 | #: ../src/prefs.js:57 70 | msgid "Indicator status text" 71 | msgstr "" 72 | 73 | #: ../src/prefs.js:58 74 | msgid "" 75 | "{trackArtist}: Artist, {trackAlbum}: Album, {trackTitle}: Title. Pango " 76 | "markup supported." 77 | msgstr "" 78 | 79 | #: ../src/prefs.js:62 80 | msgid "Indicator status text width" 81 | msgstr "" 82 | 83 | #: ../src/prefs.js:63 84 | msgid "" 85 | "The the maximum width before the status text gets an ellipsis. Default is " 86 | "300px." 87 | msgstr "" 88 | 89 | #: ../src/prefs.js:71 90 | msgid "Allow to start the default media player" 91 | msgstr "Uruchamianie domyślnego odtwarzacza" 92 | 93 | #: ../src/prefs.js:75 94 | msgid "Show the media player volume slider" 95 | msgstr "Wyświetlanie suwaka głośności odtwarzacza" 96 | 97 | #: ../src/prefs.js:79 98 | msgid "Show the media player position slider" 99 | msgstr "Wyświetlanie suwaka pozycji odtwarzania" 100 | 101 | #: ../src/prefs.js:83 102 | msgid "Show media player playlists" 103 | msgstr "Wyświetlanie list odtwarzania" 104 | 105 | #: ../src/prefs.js:87 106 | msgid "Display song rating" 107 | msgstr "" 108 | 109 | #: ../src/prefs.js:88 110 | msgid "Display the currently playing song's rating on a 0 to 5 scale" 111 | msgstr "" 112 | 113 | #, fuzzy 114 | #~ msgid "" 115 | #~ "Runs the default mediaplayer by clicking on the indicator or from the menu" 116 | #~ msgstr "" 117 | #~ "Uruchamia domyślny odtwarzacz multimediów po kliknięciu w ikonę stanu " 118 | #~ "rozszerzenia" 119 | 120 | #~ msgid "by" 121 | #~ msgstr "w wykonaniu" 122 | 123 | #~ msgid "from" 124 | #~ msgstr "z albumu" 125 | 126 | #~ msgid "Unknown Artist" 127 | #~ msgstr "Nieznany wykonawca" 128 | 129 | #~ msgid "Unknown Album" 130 | #~ msgstr "Nieznany album" 131 | 132 | #~ msgid "Unknown Title" 133 | #~ msgstr "Nieznany tytuł" 134 | 135 | #~ msgid "Album cover size" 136 | #~ msgstr "Rozmiar okładki albumu" 137 | 138 | #~ msgid "The size of the cover displayed in the menu. Default is 80px width." 139 | #~ msgstr "" 140 | #~ "Określa rozmiar okładki wyświetlanej w menu. Domyślna szerokość obrazu " 141 | #~ "wynosi 80 pikseli." 142 | 143 | #~ msgid "Show the media player in the volume menu" 144 | #~ msgstr "Wyświetlanie rozszerzenia w menu głośności" 145 | -------------------------------------------------------------------------------- /po/pt_BR.po: -------------------------------------------------------------------------------- 1 | # Brazilian Portuguese Translation for gnome-shell-extension-mediaplayer. 2 | # Copyright (C) 2012 - gnome-shell-extension-mediaplayer 3 | # This file is distributed under the same license as the 4 | # gnome-shell-extension-mediaplayer package. 5 | # Elder Marco , 2012. 6 | # Fábio Nogueira , 2016. 7 | # 8 | msgid "" 9 | msgstr "" 10 | "Project-Id-Version: gnome-shell-extension-mediaplayer\n" 11 | "Report-Msgid-Bugs-To: \n" 12 | "POT-Creation-Date: 2017-03-31 10:05-0300\n" 13 | "PO-Revision-Date: 2017-03-31 10:27-0300\n" 14 | "Last-Translator: Fábio Nogueira \n" 15 | "Language-Team: \n" 16 | "Language: pt_BR\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "X-Generator: Poedit 1.8.11\n" 21 | 22 | #: prefs.js:39 23 | msgid "Indicator position" 24 | msgstr "Posição do indicador" 25 | 26 | #: prefs.js:41 27 | msgid "Center" 28 | msgstr "Centro" 29 | 30 | #: prefs.js:42 31 | msgid "Right" 32 | msgstr "Direita" 33 | 34 | #: prefs.js:43 35 | msgid "System menu" 36 | msgstr "Menu do sistema" 37 | 38 | #: prefs.js:48 39 | msgid "Indicator appearance" 40 | msgstr "Aparência do indicador" 41 | 42 | #: prefs.js:50 43 | msgid "Symbolic icon" 44 | msgstr "Ícone simbólico" 45 | 46 | #: prefs.js:51 47 | msgid "Current album cover" 48 | msgstr "Capa atual" 49 | 50 | #: prefs.js:56 51 | msgid "Indicator status text" 52 | msgstr "Texto de status do indicador" 53 | 54 | #: prefs.js:57 55 | msgid "" 56 | "{trackArtist}: Artist, {trackAlbum}: Album, {trackTitle}: Title. Pango " 57 | "markup supported." 58 | msgstr "" 59 | "{trackArtist}: Artista, {trackAlbum}: Álbum, {trackTitle}: Título. Marcação " 60 | "Pango suportada." 61 | 62 | #: prefs.js:61 63 | msgid "Indicator status text width" 64 | msgstr "Tamanho do texto de status do indicador" 65 | 66 | #: prefs.js:62 67 | msgid "" 68 | "The maximum width before the status text gets an ellipsis. Default is 300px." 69 | msgstr "" 70 | "A largura máxima antes do texto de status recebe uma reticência. O padrão é " 71 | "300px." 72 | 73 | #: prefs.js:70 74 | msgid "Large cover size" 75 | msgstr "Tamanho da capa grande" 76 | 77 | #: prefs.js:71 78 | msgid "The size of the cover when zoomed. Default is 192px." 79 | msgstr "O tamanho da capa ao aplicar o zoom. O padrão é 192px." 80 | 81 | #: prefs.js:79 82 | msgid "Small cover size" 83 | msgstr "Tamanho da capa pequena" 84 | 85 | #: prefs.js:80 86 | msgid "The size of the cover when not zoomed. Default is 48px." 87 | msgstr "O tamanho da capa sem zoom. O padrão é 48px." 88 | 89 | #: prefs.js:88 90 | msgid "Allow the starting of the default media player" 91 | msgstr "Permitir iniciar o reprodutor padrão de mídia" 92 | 93 | #: prefs.js:92 94 | msgid "Show the media player volume slider" 95 | msgstr "Exibir o controle de volume do reprodutor" 96 | 97 | #: prefs.js:96 98 | msgid "Show the media player position slider" 99 | msgstr "Exibir o controle de posição do reprodutor" 100 | 101 | #: prefs.js:100 102 | msgid "Show the media player playlists" 103 | msgstr "Exibir playlists do reprodutor de mídia" 104 | 105 | #: prefs.js:101 106 | msgid "Few players currently support the Mpris Playlist Interface." 107 | msgstr "Atualmente poucos reprodutores suportam a interface Mpris de Playlist." 108 | 109 | #: prefs.js:105 110 | msgid "Show the media player tracklist" 111 | msgstr "Mostrar a lista de faixas do reprodutor de mídia" 112 | 113 | #: prefs.js:106 114 | msgid "Very few players currently support the Mpris Tracklist Interface." 115 | msgstr "" 116 | "Atualmente muito poucos reprodutores suportam a interface Mpris de Playlist." 117 | 118 | #: prefs.js:110 119 | msgid "Display the current song's rating" 120 | msgstr "Exibir a avaliação da música atual" 121 | 122 | #: prefs.js:111 123 | msgid "Display the currently playing song's rating on a 0 to 5 scale" 124 | msgstr "Mostra a avaliação da música que está tocando em uma escala de 0 a 5" 125 | 126 | #: prefs.js:115 127 | msgid "Display song ratings in the tracklist" 128 | msgstr "Exibe avalições das músicas na lista de faixas" 129 | 130 | #: prefs.js:116 131 | msgid "Display the ratings of the songs in tracklist on a 0 to 5 scale" 132 | msgstr "" 133 | "Exibe as avaliações das músicas na lista de faixas numa escala de 0 a 5" 134 | 135 | #: prefs.js:120 136 | msgid "Enable Indicator scroll events" 137 | msgstr "Habilitar indicador de evetos de rolagem" 138 | 139 | #: prefs.js:121 140 | msgid "Enables track changes on scrolling the Indicator." 141 | msgstr "Permite alterações da faixa no deslocamento do indicador." 142 | 143 | #: prefs.js:128 144 | msgid "Hide the built-in Mpris controls (Experimental)" 145 | msgstr "Ocultar os controles internos Mpris (Experimental)" 146 | 147 | #: prefs.js:129 148 | msgid "" 149 | "Whether to hide the built-in Mpris controls.\n" 150 | "This depends on implementation details within GNOME Shell that may change." 151 | msgstr "" 152 | "Se permite ocultar os controles internos Mpris.\n" 153 | "Isto depende dos detalhes de implementação no GNOME Shell que podem ser " 154 | "alterados." 155 | 156 | #: settings.js:60 157 | msgid "Stopped" 158 | msgstr "Parado" 159 | 160 | #: settings.js:61 161 | msgid "Playing" 162 | msgstr "Reproduzindo" 163 | 164 | #: settings.js:62 165 | msgid "Paused" 166 | msgstr "Pausado" 167 | 168 | #: settings.js:73 169 | msgid "Stations" 170 | msgstr "Estações" 171 | 172 | #: settings.js:77 173 | msgid "Current Playlist" 174 | msgstr "Playlist atual" 175 | 176 | #: ui.js:539 177 | msgid "Playlists" 178 | msgstr "Playlists" 179 | 180 | #: ui.js:554 181 | msgid "Tracks" 182 | msgstr "Faixas" 183 | 184 | #~ msgid "Volume" 185 | #~ msgstr "Volume" 186 | 187 | #~ msgid "" 188 | #~ "The the maximum width before the status text gets an ellipsis. Default is " 189 | #~ "300px." 190 | #~ msgstr "" 191 | #~ "O tamanho máximo antes do texto de status recebe reticências. O padrão é " 192 | #~ "300px." 193 | 194 | #~ msgid "Allow to start the default media player" 195 | #~ msgstr "Permitir iniciar o reprodutor padrão" 196 | 197 | #~ msgid "Show media player playlists" 198 | #~ msgstr "Exibir playlists do reprodutor" 199 | 200 | #~ msgid "Display song rating" 201 | #~ msgstr "Mostrar a avaliação da música" 202 | 203 | #~ msgid "Position in the top panel" 204 | #~ msgstr "Posição no painel superior" 205 | 206 | #~ msgid "Restart the shell to apply this setting." 207 | #~ msgstr "É necessário reiniciar o GNOME Shell" 208 | 209 | #~ msgid "Volume menu integration" 210 | #~ msgstr "Integração com o menu de volume" 211 | 212 | #, fuzzy 213 | #~ msgid "" 214 | #~ "Runs the default mediaplayer by clicking on the indicator or from the menu" 215 | #~ msgstr "Executa o reprodutor padrão através de um clique no indicador" 216 | 217 | #~ msgid "rating" 218 | #~ msgstr "avaliação" 219 | 220 | #~ msgid "by" 221 | #~ msgstr "por" 222 | 223 | #~ msgid "from" 224 | #~ msgstr "de" 225 | 226 | #~ msgid "Unknown Artist" 227 | #~ msgstr "Artista Deconhecido" 228 | 229 | #~ msgid "Unknown Album" 230 | #~ msgstr "Álbum Desconhecido" 231 | 232 | #~ msgid "Unknown Title" 233 | #~ msgstr "Título Desconhecido" 234 | 235 | #~ msgid "Album cover size" 236 | #~ msgstr "Tamanho da capa do álbum" 237 | 238 | #~ msgid "The size of the cover displayed in the menu. Default is 80px width." 239 | #~ msgstr "" 240 | #~ "O tamanho da capa exibida no menu. Por padrão, 80 pixels de largura." 241 | 242 | #~ msgid "Show the media player in the volume menu" 243 | #~ msgstr "Exibir o media player no menu de volume" 244 | 245 | #~ msgid "Schema \"%s\" not found." 246 | #~ msgstr "Esquema \"%s\" não encontrado." 247 | -------------------------------------------------------------------------------- /po/ro.po: -------------------------------------------------------------------------------- 1 | msgid "" 2 | msgstr "" 3 | "Project-Id-Version: gnome-shell-extension-mediaplayer\n" 4 | "Report-Msgid-Bugs-To: \n" 5 | "POT-Creation-Date: 2015-08-27 18:32+0200\n" 6 | "PO-Revision-Date: 2012-11-13 11:05+0100\n" 7 | "Last-Translator: Darius Berghe \n" 8 | "Language: Romanian\n" 9 | "MIME-Version: 1.0\n" 10 | "Content-Type: text/plain; charset=utf-8\n" 11 | "Content-Transfer-Encoding: 8bit\n" 12 | 13 | #: ../src/ui.js:165 14 | msgid "Volume" 15 | msgstr "Volum" 16 | 17 | #: ../src/ui.js:177 18 | msgid "Playlists" 19 | msgstr "Listă de redare" 20 | 21 | #: ../src/settings.js:51 22 | msgid "Stopped" 23 | msgstr "Oprit" 24 | 25 | #: ../src/settings.js:52 26 | msgid "Playing" 27 | msgstr "În redare" 28 | 29 | #: ../src/settings.js:53 30 | msgid "Paused" 31 | msgstr "Suspendat" 32 | 33 | #: ../src/prefs.js:40 34 | msgid "Indicator position" 35 | msgstr "" 36 | 37 | #: ../src/prefs.js:42 38 | msgid "Center" 39 | msgstr "Centru" 40 | 41 | #: ../src/prefs.js:43 42 | msgid "Right" 43 | msgstr "Dreapta" 44 | 45 | #: ../src/prefs.js:44 46 | msgid "System menu" 47 | msgstr "" 48 | 49 | #: ../src/prefs.js:49 50 | #, fuzzy 51 | msgid "Indicator appearance" 52 | msgstr "Iconița extensiei în panou" 53 | 54 | #: ../src/prefs.js:51 55 | msgid "Symbolic icon" 56 | msgstr "Iconiță simbolică" 57 | 58 | #: ../src/prefs.js:52 59 | msgid "Current album cover" 60 | msgstr "Imaginea de album" 61 | 62 | #: ../src/prefs.js:57 63 | #, fuzzy 64 | msgid "Indicator status text" 65 | msgstr "Text de stare" 66 | 67 | #: ../src/prefs.js:58 68 | #, fuzzy 69 | msgid "" 70 | "{trackArtist}: Artist, {trackAlbum}: Album, {trackTitle}: Title. Pango " 71 | "markup supported." 72 | msgstr "%a: Artist, %b: Album, %t: Titlu. Formatarea Pango e suportată." 73 | 74 | #: ../src/prefs.js:62 75 | #, fuzzy 76 | msgid "Indicator status text width" 77 | msgstr "Lățimea textului de stare" 78 | 79 | #: ../src/prefs.js:63 80 | msgid "" 81 | "The the maximum width before the status text gets an ellipsis. Default is " 82 | "300px." 83 | msgstr "" 84 | 85 | #: ../src/prefs.js:71 86 | msgid "Allow to start the default media player" 87 | msgstr "Permite pornirea programului media implicit" 88 | 89 | #: ../src/prefs.js:75 90 | msgid "Show the media player volume slider" 91 | msgstr "Arată bara de control a volumului" 92 | 93 | #: ../src/prefs.js:79 94 | msgid "Show the media player position slider" 95 | msgstr "Arată bara de redare a poziției" 96 | 97 | #: ../src/prefs.js:83 98 | msgid "Show media player playlists" 99 | msgstr "Arată listele de redare" 100 | 101 | #: ../src/prefs.js:87 102 | msgid "Display song rating" 103 | msgstr "Arată nota melodiei" 104 | 105 | #: ../src/prefs.js:88 106 | msgid "Display the currently playing song's rating on a 0 to 5 scale" 107 | msgstr "Arată nota pentru melodia în curs de rulare pe o scară de la 0 la 5" 108 | 109 | #~ msgid "Position in the top panel" 110 | #~ msgstr "Poziția în panou" 111 | 112 | #~ msgid "Restart the shell to apply this setting." 113 | #~ msgstr "Reporniți interfața Gnome pentru a aplica setările." 114 | 115 | #~ msgid "Volume menu integration" 116 | #~ msgstr "Integrarea în meniul volumului" 117 | 118 | #, fuzzy 119 | #~ msgid "" 120 | #~ "Runs the default mediaplayer by clicking on the indicator or from the menu" 121 | #~ msgstr "Pornește programul media implicit la apăsarea indicatorului" 122 | 123 | #~ msgid "rating" 124 | #~ msgstr "notă" 125 | 126 | #~ msgid "by" 127 | #~ msgstr "de" 128 | 129 | #~ msgid "from" 130 | #~ msgstr "de la" 131 | 132 | #~ msgid "Unknown Artist" 133 | #~ msgstr "Artist necunoscut" 134 | 135 | #~ msgid "Unknown Album" 136 | #~ msgstr "Album necunoscut" 137 | 138 | #~ msgid "Unknown Title" 139 | #~ msgstr "Titlu necunoscut" 140 | 141 | #~ msgid "Album cover size" 142 | #~ msgstr "Mărimea imaginii de album" 143 | 144 | #~ msgid "The size of the cover displayed in the menu. Default is 80px width." 145 | #~ msgstr "Mărimea imaginii de album afișată în meniu. (Implicit: 80px lățime)" 146 | -------------------------------------------------------------------------------- /po/ru.po: -------------------------------------------------------------------------------- 1 | msgid "" 2 | msgstr "" 3 | "Project-Id-Version: gnome-shell-extension-mediaplayer\n" 4 | "Report-Msgid-Bugs-To: \n" 5 | "POT-Creation-Date: 2015-08-27 18:32+0200\n" 6 | "PO-Revision-Date: 2012-11-11 12:25+0300\n" 7 | "Last-Translator: Pavel Vasin\n" 8 | "Language-Team: Aries-Soft Roman aries-soft@mail.ru\n" 9 | "Language: Russian\n" 10 | "MIME-Version: 1.0\n" 11 | "Content-Type: text/plain; charset=UTF-8\n" 12 | "Content-Transfer-Encoding: 8bit\n" 13 | "X-Generator: Poedit 1.5.4\n" 14 | 15 | #: ../src/ui.js:165 16 | msgid "Volume" 17 | msgstr "Громкость" 18 | 19 | #: ../src/ui.js:177 20 | msgid "Playlists" 21 | msgstr "Плейлисты" 22 | 23 | #: ../src/settings.js:51 24 | msgid "Stopped" 25 | msgstr "Остановлено" 26 | 27 | #: ../src/settings.js:52 28 | msgid "Playing" 29 | msgstr "Проигрывается" 30 | 31 | #: ../src/settings.js:53 32 | msgid "Paused" 33 | msgstr "Пауза" 34 | 35 | #: ../src/prefs.js:40 36 | msgid "Indicator position" 37 | msgstr "" 38 | 39 | #: ../src/prefs.js:42 40 | msgid "Center" 41 | msgstr "По центру" 42 | 43 | #: ../src/prefs.js:43 44 | msgid "Right" 45 | msgstr "Справа" 46 | 47 | #: ../src/prefs.js:44 48 | msgid "System menu" 49 | msgstr "" 50 | 51 | #: ../src/prefs.js:49 52 | #, fuzzy 53 | msgid "Indicator appearance" 54 | msgstr "Внешний вид" 55 | 56 | #: ../src/prefs.js:51 57 | msgid "Symbolic icon" 58 | msgstr "Иконка" 59 | 60 | #: ../src/prefs.js:52 61 | msgid "Current album cover" 62 | msgstr "Обложка альбома" 63 | 64 | #: ../src/prefs.js:57 65 | #, fuzzy 66 | msgid "Indicator status text" 67 | msgstr "Текст статуса" 68 | 69 | #: ../src/prefs.js:58 70 | #, fuzzy 71 | msgid "" 72 | "{trackArtist}: Artist, {trackAlbum}: Album, {trackTitle}: Title. Pango " 73 | "markup supported." 74 | msgstr "" 75 | "%a: исполнитель, %b: альбом, %t: название. Поддерживается разметка Pango." 76 | 77 | #: ../src/prefs.js:62 78 | #, fuzzy 79 | msgid "Indicator status text width" 80 | msgstr "Текст статуса" 81 | 82 | #: ../src/prefs.js:63 83 | msgid "" 84 | "The the maximum width before the status text gets an ellipsis. Default is " 85 | "300px." 86 | msgstr "" 87 | 88 | #: ../src/prefs.js:71 89 | msgid "Allow to start the default media player" 90 | msgstr "Разрешить запуск плеера по умолчанию" 91 | 92 | #: ../src/prefs.js:75 93 | msgid "Show the media player volume slider" 94 | msgstr "Показывать регулятор громкости" 95 | 96 | #: ../src/prefs.js:79 97 | msgid "Show the media player position slider" 98 | msgstr "Показывать регулятор позиции" 99 | 100 | #: ../src/prefs.js:83 101 | msgid "Show media player playlists" 102 | msgstr "Показывать плейлисты" 103 | 104 | #: ../src/prefs.js:87 105 | msgid "Display song rating" 106 | msgstr "Показывать оценку песен" 107 | 108 | #: ../src/prefs.js:88 109 | msgid "Display the currently playing song's rating on a 0 to 5 scale" 110 | msgstr "Показывать оценку текущей песни по шкале от 0 до 5" 111 | 112 | #~ msgid "Position in the top panel" 113 | #~ msgstr "Расположение на панели" 114 | 115 | #~ msgid "Restart the shell to apply this setting." 116 | #~ msgstr "Для этой опции требуется перезапуск gnome-shell." 117 | 118 | #~ msgid "Volume menu integration" 119 | #~ msgstr "В индикаторе громкости" 120 | 121 | #, fuzzy 122 | #~ msgid "" 123 | #~ "Runs the default mediaplayer by clicking on the indicator or from the menu" 124 | #~ msgstr "Запуск плеера кликом по иконке индикатора" 125 | 126 | #~ msgid "rating" 127 | #~ msgstr "оценка" 128 | 129 | #~ msgid "by" 130 | #~ msgstr "исполняет" 131 | 132 | #~ msgid "from" 133 | #~ msgstr "из альбома" 134 | 135 | #~ msgid "Unknown Artist" 136 | #~ msgstr "Неизвестный исполнитель" 137 | 138 | #~ msgid "Unknown Album" 139 | #~ msgstr "Неизвестный альбом" 140 | 141 | #~ msgid "Unknown Title" 142 | #~ msgstr "Неизвестное название" 143 | 144 | #~ msgid "Album cover size" 145 | #~ msgstr "Размер обложки альбома" 146 | 147 | #~ msgid "The size of the cover displayed in the menu. Default is 80px width." 148 | #~ msgstr "Размер обложки, отображаемой в меню. По умолчанию 80 пикселей." 149 | 150 | #~ msgid "Show the media player in the volume menu" 151 | #~ msgstr "Встроить в индикатор громкости" 152 | -------------------------------------------------------------------------------- /po/sk.po: -------------------------------------------------------------------------------- 1 | # Slovak translation for gnome-shell-extension-mediaplayer. 2 | # Copyright (C) 2015 THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the gnome-shell-extension-mediaplayer package. 4 | # Juraj Fiala , 2015. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: gnome-shell-extension-mediaplayer\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2015-10-20 18:00+0100\n" 11 | "PO-Revision-Date: 2015-10-20 18:00+0100\n" 12 | "Last-Translator: Juraj Fiala \n" 13 | "Language-Team: Slovak\n" 14 | "Language: Slovak\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bits\n" 18 | "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" 19 | 20 | #: ../src/ui.js:165 21 | msgid "Volume" 22 | msgstr "Hlasitosť" 23 | 24 | #: ../src/ui.js:177 25 | msgid "Playlists" 26 | msgstr "Zoznamy skladieb" 27 | 28 | #: ../src/settings.js:51 29 | msgid "Stopped" 30 | msgstr "Zastavené" 31 | 32 | #: ../src/settings.js:52 33 | msgid "Playing" 34 | msgstr "Prehráva sa" 35 | 36 | #: ../src/settings.js:53 37 | msgid "Paused" 38 | msgstr "Pozastavené" 39 | 40 | #: ../src/prefs.js:40 41 | msgid "Indicator position" 42 | msgstr "Umiestnenie indikátora" 43 | 44 | #: ../src/prefs.js:42 45 | msgid "Center" 46 | msgstr "Stred" 47 | 48 | #: ../src/prefs.js:43 49 | msgid "Right" 50 | msgstr "Vpravo" 51 | 52 | #: ../src/prefs.js:44 53 | msgid "System menu" 54 | msgstr "Sytémové menu" 55 | 56 | #: ../src/prefs.js:49 57 | msgid "Indicator appearance" 58 | msgstr "Vzhľad indikátora" 59 | 60 | #: ../src/prefs.js:51 61 | msgid "Symbolic icon" 62 | msgstr "Symbolická ikona" 63 | 64 | #: ../src/prefs.js:52 65 | msgid "Current album cover" 66 | msgstr "Obal aktuálneho albumu" 67 | 68 | #: ../src/prefs.js:57 69 | msgid "Indicator status text" 70 | msgstr "Text stavu indikátora" 71 | 72 | #: ../src/prefs.js:58 73 | msgid "" 74 | "{trackArtist}: Artist, {trackAlbum}: Album, {trackTitle}: Title. Pango " 75 | "markup supported." 76 | msgstr "%a: Interpret, %b: Album, %t: Skladba. Pango syntax podporovaný." 77 | 78 | #: ../src/prefs.js:62 79 | msgid "Indicator status text width" 80 | msgstr "Šírka textu stavu indikátora" 81 | 82 | #: ../src/prefs.js:63 83 | msgid "" 84 | "The the maximum width before the status text gets an ellipsis. Default is " 85 | "300px." 86 | msgstr "" 87 | "Maximálna šírka pred skrátením stavového textu. Predvolená hodnota je " 88 | "300px." 89 | 90 | #: ../src/prefs.js:71 91 | msgid "Allow to start the default media player" 92 | msgstr "Povoliť zapnutie predvoleného prehrávača médií" 93 | 94 | #: ../src/prefs.js:75 95 | msgid "Show the media player volume slider" 96 | msgstr "Ukázať ovládanie hlasitosi prehrávača médií" 97 | 98 | #: ../src/prefs.js:79 99 | msgid "Show the media player position slider" 100 | msgstr "Ukázať posuvník na časovej osi prehrávača médií" 101 | 102 | #: ../src/prefs.js:83 103 | msgid "Show media player playlists" 104 | msgstr "Ukázať zoznamy skladieb prehrávača médií" 105 | 106 | #: ../src/prefs.js:87 107 | msgid "Display song rating" 108 | msgstr "Ukázať hodnotenie skladby" 109 | 110 | #: ../src/prefs.js:88 111 | msgid "Display the currently playing song's rating on a 0 to 5 scale" 112 | msgstr "Ukázať hodnotenie práve hranej skladby na stupnici od 0 po 5" 113 | 114 | #, fuzzy 115 | #~ msgid "" 116 | #~ "Runs the default mediaplayer by clicking on the indicator or from the menu" 117 | #~ msgstr "" 118 | #~ "Spustí predvolený prehrávač médií pri kliknutí na indikátor alebo z menu" 119 | 120 | #~ msgid "by" 121 | #~ msgstr "od interpreta" 122 | 123 | #~ msgid "from" 124 | #~ msgstr "z albumu" 125 | 126 | #~ msgid "Unknown Artist" 127 | #~ msgstr "Neznámy interpret" 128 | 129 | #~ msgid "Unknown Album" 130 | #~ msgstr "Neznámy album" 131 | 132 | #~ msgid "Unknown Title" 133 | #~ msgstr "Neznáma skladba" 134 | 135 | #~ msgid "Album cover size" 136 | #~ msgstr "Velkosť obalu albumu" 137 | 138 | #~ msgid "The size of the cover displayed in the menu. Default is 80px width." 139 | #~ msgstr "" 140 | #~ "Veľkosť obalu zobrazeného v menu. Predvolená hodnota je 80px šírka." 141 | 142 | #~ msgid "Show the media player in the volume menu" 143 | #~ msgstr "Ukázať prehrávač médií v menu hlasitosti" 144 | -------------------------------------------------------------------------------- /po/sr.po: -------------------------------------------------------------------------------- 1 | # Serbian Translation for gnome-shell-extension-mediaplayer package 2 | # Преводи на српски језик за пакет „gnome-shell-extension-mediaplayer“. 3 | # Copyright (C) 2012 gnome-shell-extension-mediaplayer package. 4 | # This file is distributed under the same license as the gnome-shell-extension-mediaplayer package. 5 | # Марко М. Костић , 2015. 6 | # 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: gnome-shell-extension-mediaplayer\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2015-08-27 18:32+0200\n" 12 | "PO-Revision-Date: 2015-06-11 13:33+0200\n" 13 | "Last-Translator: Марко М. Костић (Marko M. Kostić) \n" 15 | "Language-Team: Serbian\n" 16 | "Language: Serbian\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=utf-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" 21 | "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" 22 | 23 | #: ../src/ui.js:165 24 | msgid "Volume" 25 | msgstr "Јачина звука" 26 | 27 | #: ../src/ui.js:177 28 | msgid "Playlists" 29 | msgstr "Списак песама" 30 | 31 | #: ../src/settings.js:51 32 | msgid "Stopped" 33 | msgstr "Заустављено" 34 | 35 | #: ../src/settings.js:52 36 | msgid "Playing" 37 | msgstr "Пуштено" 38 | 39 | #: ../src/settings.js:53 40 | msgid "Paused" 41 | msgstr "Паузирано" 42 | 43 | #: ../src/prefs.js:40 44 | msgid "Indicator position" 45 | msgstr "" 46 | 47 | #: ../src/prefs.js:42 48 | msgid "Center" 49 | msgstr "Центар" 50 | 51 | #: ../src/prefs.js:43 52 | msgid "Right" 53 | msgstr "Десно" 54 | 55 | #: ../src/prefs.js:44 56 | msgid "System menu" 57 | msgstr "" 58 | 59 | #: ../src/prefs.js:49 60 | #, fuzzy 61 | msgid "Indicator appearance" 62 | msgstr "Изглед" 63 | 64 | #: ../src/prefs.js:51 65 | msgid "Symbolic icon" 66 | msgstr "Симболичка иконица" 67 | 68 | #: ../src/prefs.js:52 69 | msgid "Current album cover" 70 | msgstr "Тренутни омот албума" 71 | 72 | #: ../src/prefs.js:57 73 | #, fuzzy 74 | msgid "Indicator status text" 75 | msgstr "Статусни текст" 76 | 77 | #: ../src/prefs.js:58 78 | #, fuzzy 79 | msgid "" 80 | "{trackArtist}: Artist, {trackAlbum}: Album, {trackTitle}: Title. Pango " 81 | "markup supported." 82 | msgstr "%a: Извођач, %b: Албум, %t: Наслов. Панго маркап је подржан." 83 | 84 | #: ../src/prefs.js:62 85 | #, fuzzy 86 | msgid "Indicator status text width" 87 | msgstr "Статусни текст" 88 | 89 | #: ../src/prefs.js:63 90 | msgid "" 91 | "The the maximum width before the status text gets an ellipsis. Default is " 92 | "300px." 93 | msgstr "" 94 | 95 | #: ../src/prefs.js:71 96 | msgid "Allow to start the default media player" 97 | msgstr "Омогући покретање подразумеваног пуштача музике" 98 | 99 | #: ../src/prefs.js:75 100 | msgid "Show the media player volume slider" 101 | msgstr "Покажи клизач за промену јачине звука" 102 | 103 | #: ../src/prefs.js:79 104 | msgid "Show the media player position slider" 105 | msgstr "Покажи клизач за премотавање песме" 106 | 107 | #: ../src/prefs.js:83 108 | msgid "Show media player playlists" 109 | msgstr "Прикажи списак са песмама" 110 | 111 | #: ../src/prefs.js:87 112 | msgid "Display song rating" 113 | msgstr "Прикажи оцену песме" 114 | 115 | #: ../src/prefs.js:88 116 | msgid "Display the currently playing song's rating on a 0 to 5 scale" 117 | msgstr "Прикажи оцену на скали од 0 до 5 за тренутно пуштену песму" 118 | 119 | #~ msgid "Position in the top panel" 120 | #~ msgstr "Положај у горњој траци" 121 | 122 | #~ msgid "Restart the shell to apply this setting." 123 | #~ msgstr "Поново покрените Гномову шкољку да би се подешавање применило." 124 | 125 | #~ msgid "Volume menu integration" 126 | #~ msgstr "Угради у показивач јачине звука" 127 | 128 | #, fuzzy 129 | #~ msgid "" 130 | #~ "Runs the default mediaplayer by clicking on the indicator or from the menu" 131 | #~ msgstr "Покреће подразумевани пуштач музике приликом кликтања на показивач" 132 | 133 | #~ msgid "rating" 134 | #~ msgstr "оцена" 135 | 136 | #~ msgid "by" 137 | #~ msgstr "изводи" 138 | 139 | #~ msgid "from" 140 | #~ msgstr "са албума" 141 | 142 | #~ msgid "Unknown Artist" 143 | #~ msgstr "Непознат извођач" 144 | 145 | #~ msgid "Unknown Album" 146 | #~ msgstr "Непознат албум" 147 | 148 | #~ msgid "Unknown Title" 149 | #~ msgstr "Непознат наслов" 150 | 151 | #~ msgid "Album cover size" 152 | #~ msgstr "Величина омота албума" 153 | 154 | #~ msgid "The size of the cover displayed in the menu. Default is 80px width." 155 | #~ msgstr "Величина омота приказаног у менију. Подразумевано је 80 пиксела." 156 | 157 | #~ msgid "Show the media player in the volume menu" 158 | #~ msgstr "Прикажи пуштач музике у показивачу јачине звука" 159 | -------------------------------------------------------------------------------- /po/tr.po: -------------------------------------------------------------------------------- 1 | # Turkish Translation for gnome-shell-extension-mediaplayer package. 2 | # Copyright (C) 2012 gnome-shell-extension-mediaplayer package. 3 | # This file is distributed under the same license as the gnome-shell-extension-mediaplayer package. 4 | # Osman Karagöz , 2013 5 | # Serdar Sağlam , 2019. 6 | # 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: gnome-shell-extension-mediaplayer\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2015-08-27 18:32+0200\n" 12 | "PO-Revision-Date: 2019-03-13 02:34+0300\n" 13 | "Last-Translator: Serdar Sağlam \n" 14 | "Language-Team: Turkish <>\n" 15 | "Language: tr\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Plural-Forms: nplurals=1; plural=0\n" 20 | "X-Generator: Gtranslator 3.31.90\n" 21 | "X-Poedit-SourceCharset: UTF-8\n" 22 | 23 | #: ../src/ui.js:165 24 | msgid "Volume" 25 | msgstr "Ses" 26 | 27 | #: ../src/ui.js:177 28 | msgid "Playlists" 29 | msgstr "Çalma Listesi" 30 | 31 | #: ../src/settings.js:51 32 | msgid "Stopped" 33 | msgstr "Durduruldu" 34 | 35 | #: ../src/settings.js:52 36 | msgid "Playing" 37 | msgstr "Çalıyor" 38 | 39 | #: ../src/settings.js:53 40 | msgid "Paused" 41 | msgstr "Duraklatıldı" 42 | 43 | #: ../src/prefs.js:40 44 | msgid "Indicator position" 45 | msgstr "Gösterge konumu" 46 | 47 | #: ../src/prefs.js:42 48 | msgid "Center" 49 | msgstr "Merkez" 50 | 51 | #: ../src/prefs.js:43 52 | msgid "Right" 53 | msgstr "Sağ" 54 | 55 | #: ../src/prefs.js:44 56 | msgid "System menu" 57 | msgstr "Sistem menüsü" 58 | 59 | #: ../src/prefs.js:49 60 | msgid "Indicator appearance" 61 | msgstr "Gösterge görünümü" 62 | 63 | #: ../src/prefs.js:51 64 | msgid "Symbolic icon" 65 | msgstr "Sembolik simge" 66 | 67 | #: ../src/prefs.js:52 68 | msgid "Current album cover" 69 | msgstr "Şuanki albüm kapağı" 70 | 71 | #: ../src/prefs.js:57 72 | msgid "Indicator status text" 73 | msgstr "Gösterge durum metni" 74 | 75 | #: ../src/prefs.js:58 76 | msgid "" 77 | "{trackArtist}: Artist, {trackAlbum}: Album, {trackTitle}: Title. Pango " 78 | "markup supported." 79 | msgstr "" 80 | "{trackArtist}: Sanatçı, {trackAlbum}: Albüm, {trackTitle}: Başlık. Pango " 81 | "işaretlemesi desteği." 82 | 83 | #: ../src/prefs.js:62 84 | msgid "Indicator status text width" 85 | msgstr "Gösterge durum metni genişliği" 86 | 87 | #: ../src/prefs.js:63 88 | msgid "" 89 | "The the maximum width before the status text gets an ellipsis. Default is " 90 | "300px." 91 | msgstr "" 92 | "Durum metninden önce en fazla genişlik üç nokta alır. Öntanımlı değer 300 " 93 | "piksel." 94 | 95 | #: ../src/prefs.js:71 96 | msgid "Allow to start the default media player" 97 | msgstr "Öntanımlı medya oynatıcısını başlatmaya izin ver" 98 | 99 | #: ../src/prefs.js:75 100 | msgid "Show the media player volume slider" 101 | msgstr "Medya oynatıcı ses ayarlayıcısını göster" 102 | 103 | #: ../src/prefs.js:79 104 | msgid "Show the media player position slider" 105 | msgstr "Medya oynatıcı konum ayarlayıcısını göster" 106 | 107 | #: ../src/prefs.js:83 108 | msgid "Show media player playlists" 109 | msgstr "Medya oynatıcı oynatma listesi göster" 110 | 111 | #: ../src/prefs.js:87 112 | msgid "Display song rating" 113 | msgstr "Şarkı puanını göster" 114 | 115 | #: ../src/prefs.js:88 116 | msgid "Display the currently playing song's rating on a 0 to 5 scale" 117 | msgstr "Çalan şarkının puanını 0 ila 5 aralığında göster" 118 | -------------------------------------------------------------------------------- /po/uk_UA.po: -------------------------------------------------------------------------------- 1 | msgid "" 2 | msgstr "" 3 | "Project-Id-Version: gnome-shell-extension-mediaplayer\n" 4 | "Report-Msgid-Bugs-To: \n" 5 | "POT-Creation-Date: 2015-08-27 18:32+0200\n" 6 | "PO-Revision-Date: 2018-12-19 12:58+0200\n" 7 | "Last-Translator: Igor Gordiichuk \n" 8 | "Language-Team: \n" 9 | "Language: uk_UA\n" 10 | "MIME-Version: 1.0\n" 11 | "Content-Type: text/plain; charset=UTF-8\n" 12 | "Content-Transfer-Encoding: 8bit\n" 13 | "X-Generator: Poedit 2.2\n" 14 | 15 | #: ../src/ui.js:165 16 | msgid "Volume" 17 | msgstr "Гучнісь" 18 | 19 | #: ../src/ui.js:177 20 | msgid "Playlists" 21 | msgstr "Списки відтворень" 22 | 23 | #: ../src/settings.js:51 24 | msgid "Stopped" 25 | msgstr "Зупинено" 26 | 27 | #: ../src/settings.js:52 28 | msgid "Playing" 29 | msgstr "Відтвоорюється" 30 | 31 | #: ../src/settings.js:53 32 | msgid "Paused" 33 | msgstr "Пауза" 34 | 35 | #: ../src/prefs.js:40 36 | msgid "Indicator position" 37 | msgstr "Розташування індикатора" 38 | 39 | #: ../src/prefs.js:42 40 | msgid "Center" 41 | msgstr "По центру" 42 | 43 | #: ../src/prefs.js:43 44 | msgid "Right" 45 | msgstr "Праворуч" 46 | 47 | #: ../src/prefs.js:44 48 | msgid "System menu" 49 | msgstr "Меню системи" 50 | 51 | #: ../src/prefs.js:49 52 | msgid "Indicator appearance" 53 | msgstr "Зовнішній вигляд" 54 | 55 | #: ../src/prefs.js:51 56 | msgid "Symbolic icon" 57 | msgstr "Піктограма" 58 | 59 | #: ../src/prefs.js:52 60 | msgid "Current album cover" 61 | msgstr "Обкладинка альбаму" 62 | 63 | #: ../src/prefs.js:57 64 | msgid "Indicator status text" 65 | msgstr "Текст статуса індикатора" 66 | 67 | #: ../src/prefs.js:58 68 | msgid "" 69 | "{trackArtist}: Artist, {trackAlbum}: Album, {trackTitle}: Title. Pango " 70 | "markup supported." 71 | msgstr "%a: виконавець, %b: альбом, %t: назва. Підтримується розмітка Pango." 72 | 73 | #: ../src/prefs.js:62 74 | msgid "Indicator status text width" 75 | msgstr "Ширина тексту статуса" 76 | 77 | #: ../src/prefs.js:63 78 | msgid "" 79 | "The the maximum width before the status text gets an ellipsis. Default is " 80 | "300px." 81 | msgstr "" 82 | "Максимальна ширина тексту, до його приховування трьома крапками. Типово " 83 | "300рх." 84 | 85 | #: ../src/prefs.js:71 86 | msgid "Allow to start the default media player" 87 | msgstr "Дозволити запуск типового програвача" 88 | 89 | #: ../src/prefs.js:75 90 | msgid "Show the media player volume slider" 91 | msgstr "Показувати повзунок гучності програвача" 92 | 93 | #: ../src/prefs.js:79 94 | msgid "Show the media player position slider" 95 | msgstr "Показувати повзунок часу відтворення" 96 | 97 | #: ../src/prefs.js:83 98 | msgid "Show media player playlists" 99 | msgstr "Показувати список відтворення програвача" 100 | 101 | #: ../src/prefs.js:87 102 | msgid "Display song rating" 103 | msgstr "Показувати оцінку пісні" 104 | 105 | #: ../src/prefs.js:88 106 | msgid "Display the currently playing song's rating on a 0 to 5 scale" 107 | msgstr "Показувати оцінку поточної пісні за шкалою від 0 до 5" 108 | 109 | #~ msgid "Position in the top panel" 110 | #~ msgstr "Розташування на панелі" 111 | 112 | #~ msgid "Restart the shell to apply this setting." 113 | #~ msgstr "Для застосування цих налаштувань необхідно перезапустити gnome-shell." 114 | 115 | #~ msgid "Volume menu integration" 116 | #~ msgstr "В меню гучності" 117 | 118 | #, fuzzy 119 | #~ msgid "" 120 | #~ "Runs the default mediaplayer by clicking on the indicator or from the menu" 121 | #~ msgstr "Запуск плеєра кліком по піктограмі індикатора" 122 | 123 | #~ msgid "rating" 124 | #~ msgstr "оцінка" 125 | 126 | #~ msgid "by" 127 | #~ msgstr "виконавець" 128 | 129 | #~ msgid "from" 130 | #~ msgstr "з альбому" 131 | 132 | #~ msgid "Unknown Artist" 133 | #~ msgstr "Невідомий виконавець" 134 | 135 | #~ msgid "Unknown Album" 136 | #~ msgstr "Невідомий альбом" 137 | 138 | #~ msgid "Unknown Title" 139 | #~ msgstr "Невідома назва" 140 | 141 | #~ msgid "Album cover size" 142 | #~ msgstr "Розмір обкладинки альбому" 143 | 144 | #~ msgid "The size of the cover displayed in the menu. Default is 80px width." 145 | #~ msgstr "Розмір обкладинки, яку показано в меню. Типовий розмір 80px." 146 | 147 | #~ msgid "Show the media player in the volume menu" 148 | #~ msgstr "Вбудувати плеєр в меню гучності" 149 | -------------------------------------------------------------------------------- /po/zh_CN.po: -------------------------------------------------------------------------------- 1 | # Chinese translations for gnome-shell-extension-mediaplayer package 2 | # gnome-shell-extension-mediaplayer 软件包的简体中文翻译. 3 | # Copyright (C) 2013 THE gnome-shell-extension-mediaplayer'S COPYRIGHT HOLDER 4 | # This file is distributed under the same license as the gnome-shell-extension-mediaplayer package. 5 | # 绿色圣光 , 2013, 2014, 2015. 6 | # 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: gnome-shell-extension-mediaplayer\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2015-09-04 17:37+0800\n" 12 | "PO-Revision-Date: 2015-09-05 23:10+0800\n" 13 | "Last-Translator: 绿色圣光 \n" 14 | "Language-Team: Chinese (Simplified) <>\n" 15 | "Language: zh_CN\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Plural-Forms: nplurals=1; plural=0;\n" 20 | "X-Generator: Gtranslator 2.91.7\n" 21 | 22 | #: ../src/ui.js:163 23 | msgid "Volume" 24 | msgstr "音量" 25 | 26 | #: ../src/ui.js:175 27 | msgid "Playlists" 28 | msgstr "播放列表" 29 | 30 | #: ../src/settings.js:52 31 | msgid "Stopped" 32 | msgstr "已停止" 33 | 34 | #: ../src/settings.js:53 35 | msgid "Playing" 36 | msgstr "播放中" 37 | 38 | #: ../src/settings.js:54 39 | msgid "Paused" 40 | msgstr "已暂停" 41 | 42 | #: ../src/prefs.js:40 43 | msgid "Indicator position" 44 | msgstr "指示器位置" 45 | 46 | #: ../src/prefs.js:42 47 | msgid "Center" 48 | msgstr "中央" 49 | 50 | #: ../src/prefs.js:43 51 | msgid "Right" 52 | msgstr "右边" 53 | 54 | #: ../src/prefs.js:44 55 | msgid "System menu" 56 | msgstr "系统菜单" 57 | 58 | #: ../src/prefs.js:49 59 | msgid "Indicator appearance" 60 | msgstr "指示器外观" 61 | 62 | #: ../src/prefs.js:51 63 | msgid "Symbolic icon" 64 | msgstr "符号图标" 65 | 66 | #: ../src/prefs.js:52 67 | msgid "Current album cover" 68 | msgstr "当前专辑封面" 69 | 70 | #: ../src/prefs.js:57 71 | msgid "Indicator status text" 72 | msgstr "指示器状态文本" 73 | 74 | #: ../src/prefs.js:58 75 | msgid "" 76 | "{trackArtist}: Artist, {trackAlbum}: Album, {trackTitle}: Title. Pango " 77 | "markup supported." 78 | msgstr "" 79 | "{trackArtist}:艺人,{trackAlbum}:专辑,{trackTitle}:标题。支持 Pango " 80 | "markup 标签语法。" 81 | 82 | #: ../src/prefs.js:62 83 | msgid "Indicator status text width" 84 | msgstr "指示器状态文本宽度" 85 | 86 | #: ../src/prefs.js:63 87 | msgid "" 88 | "The the maximum width before the status text gets an ellipsis. Default is " 89 | "300px." 90 | msgstr "状态文本的最大宽度,超出的部分会以省略号代替。默认为 300px。" 91 | 92 | #: ../src/prefs.js:71 93 | msgid "Allow to start the default media player" 94 | msgstr "允许启动默认的媒体播放器" 95 | 96 | #: ../src/prefs.js:75 97 | msgid "Show the media player volume slider" 98 | msgstr "显示媒体播放器的音量控制" 99 | 100 | #: ../src/prefs.js:79 101 | msgid "Show the media player position slider" 102 | msgstr "显示媒体播放器的进度控制" 103 | 104 | #: ../src/prefs.js:83 105 | msgid "Show media player playlists" 106 | msgstr "显示媒体播放器的播放列表" 107 | 108 | #: ../src/prefs.js:87 109 | msgid "Display song rating" 110 | msgstr "显示歌曲评分" 111 | 112 | #: ../src/prefs.js:88 113 | msgid "Display the currently playing song's rating on a 0 to 5 scale" 114 | msgstr "从零到五星,展示当前正在播放的歌曲的评分。" 115 | 116 | #~ msgid "Position in the top panel" 117 | #~ msgstr "顶端面板中的位置" 118 | 119 | #~ msgid "Restart the shell to apply this setting." 120 | #~ msgstr "请重新启动 Gnome Shell 以应用设定值。" 121 | 122 | #~ msgid "Volume menu integration" 123 | #~ msgstr "整合到音量菜单" 124 | 125 | #~ msgid "" 126 | #~ "Runs the default mediaplayer by clicking on the indicator or from the menu" 127 | #~ msgstr "点击菜单或状态图标时,启动默认的媒体播放器。" 128 | 129 | #~ msgid "Album cover size" 130 | #~ msgstr "专辑封面大小" 131 | 132 | #~ msgid "The size of the cover displayed in the menu. Default is 80px width." 133 | #~ msgstr "在菜单中显示的封面大小。默认值为 80 个像素宽。" 134 | 135 | #~ msgid "rating" 136 | #~ msgstr "评分" 137 | 138 | #~ msgid "Unknown Title" 139 | #~ msgstr "未知标题" 140 | 141 | #~ msgid "by" 142 | #~ msgstr "艺人:" 143 | 144 | #~ msgid "Unknown Artist" 145 | #~ msgstr "未知艺人" 146 | 147 | #~ msgid "from" 148 | #~ msgstr "专辑:" 149 | 150 | #~ msgid "Unknown Album" 151 | #~ msgstr "未知专辑" 152 | -------------------------------------------------------------------------------- /po/zh_TW.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: gnome-shell-extension-mediaplayer\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2015-08-27 18:32+0200\n" 11 | "PO-Revision-Date: 2013-05-13 15:52+0800\n" 12 | "Last-Translator: 盧瑞元 (Ruei-Yuan Lu) \n" 13 | "Language-Team: \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Plural-Forms: nplurals=2; plural=(n>1);\n" 19 | "X-Poedit-Language: Traditional Chinese\n" 20 | "X-Poedit-Country: TAIWAN\n" 21 | 22 | #: ../src/ui.js:165 23 | msgid "Volume" 24 | msgstr "音量" 25 | 26 | #: ../src/ui.js:177 27 | msgid "Playlists" 28 | msgstr "播放清單" 29 | 30 | #: ../src/settings.js:51 31 | msgid "Stopped" 32 | msgstr "已停止" 33 | 34 | #: ../src/settings.js:52 35 | msgid "Playing" 36 | msgstr "播放中" 37 | 38 | #: ../src/settings.js:53 39 | msgid "Paused" 40 | msgstr "已暫停" 41 | 42 | #: ../src/prefs.js:40 43 | msgid "Indicator position" 44 | msgstr "" 45 | 46 | #: ../src/prefs.js:42 47 | msgid "Center" 48 | msgstr "中央" 49 | 50 | #: ../src/prefs.js:43 51 | msgid "Right" 52 | msgstr "右邊" 53 | 54 | #: ../src/prefs.js:44 55 | msgid "System menu" 56 | msgstr "" 57 | 58 | #: ../src/prefs.js:49 59 | #, fuzzy 60 | msgid "Indicator appearance" 61 | msgstr "外觀" 62 | 63 | #: ../src/prefs.js:51 64 | msgid "Symbolic icon" 65 | msgstr "符號圖示" 66 | 67 | #: ../src/prefs.js:52 68 | msgid "Current album cover" 69 | msgstr "目前的專輯封面" 70 | 71 | #: ../src/prefs.js:57 72 | #, fuzzy 73 | msgid "Indicator status text" 74 | msgstr "狀態文字訊息" 75 | 76 | #: ../src/prefs.js:58 77 | #, fuzzy 78 | msgid "" 79 | "{trackArtist}: Artist, {trackAlbum}: Album, {trackTitle}: Title. Pango " 80 | "markup supported." 81 | msgstr "%a:藝人,%b:專輯,%t:標題。支援 Pango markup 標籤語法。" 82 | 83 | #: ../src/prefs.js:62 84 | #, fuzzy 85 | msgid "Indicator status text width" 86 | msgstr "狀態文字訊息" 87 | 88 | #: ../src/prefs.js:63 89 | msgid "" 90 | "The the maximum width before the status text gets an ellipsis. Default is " 91 | "300px." 92 | msgstr "" 93 | 94 | #: ../src/prefs.js:71 95 | msgid "Allow to start the default media player" 96 | msgstr "允許啟動預設的媒體播放器" 97 | 98 | #: ../src/prefs.js:75 99 | msgid "Show the media player volume slider" 100 | msgstr "顯示媒體播放器的音量控制" 101 | 102 | #: ../src/prefs.js:79 103 | msgid "Show the media player position slider" 104 | msgstr "顯示媒體播放器的進度控制" 105 | 106 | #: ../src/prefs.js:83 107 | msgid "Show media player playlists" 108 | msgstr "顯示媒體播放器的播放清單" 109 | 110 | #: ../src/prefs.js:87 111 | msgid "Display song rating" 112 | msgstr "顯示歌曲評價" 113 | 114 | #: ../src/prefs.js:88 115 | msgid "Display the currently playing song's rating on a 0 to 5 scale" 116 | msgstr "以零到五星表示目前正在播放的歌曲的評價。" 117 | 118 | #~ msgid "Position in the top panel" 119 | #~ msgstr "頂端面板中的位置" 120 | 121 | #~ msgid "Restart the shell to apply this setting." 122 | #~ msgstr "請重新啟動 Gnome Shell 以套用設定值。" 123 | 124 | #~ msgid "Volume menu integration" 125 | #~ msgstr "整合至音量選單" 126 | 127 | #~ msgid "" 128 | #~ "Runs the default mediaplayer by clicking on the indicator or from the menu" 129 | #~ msgstr "點選選單或狀態圖示時,啟動預設的媒體播放器。" 130 | 131 | #~ msgid "Album cover size" 132 | #~ msgstr "專輯封面大小" 133 | 134 | #~ msgid "The size of the cover displayed in the menu. Default is 80px width." 135 | #~ msgstr "在選單中顯示的封面大小。預設值為 80 個像素寬。" 136 | 137 | #~ msgid "rating" 138 | #~ msgstr "評價" 139 | 140 | #~ msgid "by" 141 | #~ msgstr "藝人:" 142 | 143 | #~ msgid "from" 144 | #~ msgstr "專輯:" 145 | 146 | #~ msgid "Unknown Artist" 147 | #~ msgstr "未知的藝人" 148 | 149 | #~ msgid "Unknown Album" 150 | #~ msgstr "未知的專輯" 151 | 152 | #~ msgid "Unknown Title" 153 | #~ msgstr "未知的標題" 154 | -------------------------------------------------------------------------------- /src/dbus.js: -------------------------------------------------------------------------------- 1 | /* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */ 2 | /* jshint esnext: true */ 3 | /* jshint multistr: true */ 4 | /** 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 2 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | **/ 18 | 19 | const Gio = imports.gi.Gio; 20 | const Lang = imports.lang; 21 | const Me = imports.misc.extensionUtils.getCurrentExtension(); 22 | const Settings = Me.imports.settings; 23 | 24 | const DBusIface = '\ 25 | \ 26 | \ 27 | \ 28 | \ 29 | \ 30 | \ 31 | \ 32 | \ 33 | \ 34 | \ 35 | \ 36 | \ 37 | \ 38 | \ 39 | '; 40 | const DBusProxy = Gio.DBusProxy.makeProxyWrapper(DBusIface); 41 | 42 | const PropertiesIface = '\ 43 | \ 44 | \ 45 | \ 46 | \ 47 | \ 48 | \ 49 | \ 50 | \ 51 | \ 52 | \ 53 | \ 54 | \ 55 | \ 56 | \ 57 | \ 58 | \ 59 | '; 60 | const PropertiesProxy = Gio.DBusProxy.makeProxyWrapper(PropertiesIface); 61 | 62 | const MediaServer2Iface = '\ 63 | \ 64 | \ 65 | \ 66 | \ 67 | \ 68 | \ 69 | \ 70 | \ 71 | \ 72 | '; 73 | const MediaServer2Proxy = Gio.DBusProxy.makeProxyWrapper(MediaServer2Iface); 74 | 75 | 76 | // For some reason the Nuvola dev was told to scab in a non-spec 77 | // prop and method for the support of setting ratings instead of 78 | // making a seperate ratings extension interface. 79 | // Oh well, they really don't hurt anything. No other player will try 80 | // to use them anyway... 81 | const MediaServer2PlayerIface = '\ 82 | \ 83 | \ 84 | \ 85 | \ 86 | \ 87 | \ 88 | \ 89 | \ 90 | \ 91 | \ 92 | \ 93 | \ 94 | \ 95 | \ 96 | \ 97 | \ 98 | \ 99 | \ 100 | \ 101 | \ 102 | \ 103 | \ 104 | \ 105 | \ 106 | \ 107 | \ 108 | \ 109 | '; 110 | const MediaServer2PlayerProxy = Gio.DBusProxy.makeProxyWrapper(MediaServer2PlayerIface); 111 | 112 | const MediaServer2PlaylistsIface = '\ 113 | \ 114 | \ 115 | \ 116 | \ 117 | \ 118 | \ 119 | \ 120 | \ 121 | \ 122 | \ 123 | \ 124 | \ 125 | \ 126 | \ 127 | \ 128 | \ 129 | \ 130 | \ 131 | '; 132 | const MediaServer2PlaylistsProxy = Gio.DBusProxy.makeProxyWrapper(MediaServer2PlaylistsIface); 133 | 134 | const MediaServer2TracklistIface = '\ 135 | \ 136 | \ 137 | \ 138 | \ 139 | \ 140 | \ 141 | \ 142 | \ 143 | \ 144 | \ 145 | \ 146 | \ 147 | \ 148 | \ 149 | \ 150 | \ 151 | \ 152 | \ 153 | \ 154 | \ 155 | \ 156 | \ 157 | \ 158 | \ 159 | \ 160 | '; 161 | const MediaServer2TracklistProxy = Gio.DBusProxy.makeProxyWrapper(MediaServer2TracklistIface); 162 | 163 | const PithosRatingsIface = '\ 164 | \ 165 | \ 166 | \ 167 | \ 168 | \ 169 | \ 170 | \ 171 | \ 172 | \ 173 | \ 174 | \ 175 | \ 176 | \ 177 | \ 178 | \ 179 | '; 180 | const PithosRatingsProxy = Gio.DBusProxy.makeProxyWrapper(PithosRatingsIface); 181 | 182 | const RatingsExtensionIface = '\ 183 | \ 184 | \ 185 | \ 186 | \ 187 | \ 188 | \ 189 | \ 190 | '; 191 | const RatingsExtensionProxy = Gio.DBusProxy.makeProxyWrapper(RatingsExtensionIface); 192 | 193 | const Rhythmbox3Iface = '\ 194 | \ 195 | \ 196 | \ 197 | \ 198 | \ 199 | \ 200 | '; 201 | 202 | const Rhythmbox3Proxy = Gio.DBusProxy.makeProxyWrapper(Rhythmbox3Iface); 203 | 204 | function DBus() { 205 | return new DBusProxy(Gio.DBus.session, 'org.freedesktop.DBus', 206 | '/org/freedesktop/DBus'); 207 | } 208 | 209 | function Properties(owner, callback) { 210 | new PropertiesProxy(Gio.DBus.session, owner, 211 | '/org/mpris/MediaPlayer2', 212 | callback); 213 | } 214 | 215 | function MediaServer2(owner, callback) { 216 | new MediaServer2Proxy(Gio.DBus.session, owner, 217 | '/org/mpris/MediaPlayer2', 218 | callback); 219 | } 220 | 221 | function MediaServer2Player(owner, callback) { 222 | new MediaServer2PlayerProxy(Gio.DBus.session, owner, 223 | '/org/mpris/MediaPlayer2', 224 | callback); 225 | } 226 | 227 | function MediaServer2Playlists(owner, callback) { 228 | new MediaServer2PlaylistsProxy(Gio.DBus.session, owner, 229 | '/org/mpris/MediaPlayer2', 230 | callback); 231 | } 232 | 233 | function MediaServer2Tracklist(owner, callback) { 234 | new MediaServer2TracklistProxy(Gio.DBus.session, owner, 235 | '/org/mpris/MediaPlayer2', 236 | callback); 237 | } 238 | 239 | function PithosRatings(owner, callback) { 240 | if (owner != 'org.mpris.MediaPlayer2.pithos') { 241 | callback(false); 242 | } 243 | else { 244 | let proxy = new PithosRatingsProxy(Gio.DBus.session, owner, 245 | '/org/mpris/MediaPlayer2'); 246 | if (proxy.HasPithosExtension) { 247 | callback(proxy); 248 | } 249 | else { 250 | callback(false); 251 | } 252 | } 253 | } 254 | 255 | function RatingsExtension(owner, callback) { 256 | if (Settings.SUPPORTS_RATINGS_EXTENSION.indexOf(owner) == -1) { 257 | callback(false); 258 | } 259 | else { 260 | let proxy = new RatingsExtensionProxy(Gio.DBus.session, owner, 261 | '/org/mpris/MediaPlayer2'); 262 | if (proxy.HasRatingsExtension) { 263 | callback(proxy); 264 | } 265 | else { 266 | callback(false); 267 | } 268 | } 269 | } 270 | 271 | function RhythmboxRatings(owner) { 272 | if (owner != 'org.mpris.MediaPlayer2.rhythmbox') { 273 | return false; 274 | } 275 | else { 276 | return new Rhythmbox3Proxy(Gio.DBus.session, "org.gnome.Rhythmbox3", 277 | "/org/gnome/Rhythmbox3/RhythmDB"); 278 | } 279 | } 280 | -------------------------------------------------------------------------------- /src/extension.js: -------------------------------------------------------------------------------- 1 | /* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */ 2 | /* jshint esnext: true */ 3 | /* jshint -W097 */ 4 | /* global imports: false */ 5 | /* global global: false */ 6 | /** 7 | This program is free software: you can redistribute it and/or modify 8 | it under the terms of the GNU General Public License as published by 9 | the Free Software Foundation, either version 2 of the License, or 10 | (at your option) any later version. 11 | 12 | This program is distributed in the hope that it will be useful, 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | GNU General Public License for more details. 16 | 17 | You should have received a copy of the GNU General Public License 18 | along with this program. If not, see . 19 | **/ 20 | 21 | const Main = imports.ui.main; 22 | const Gettext = imports.gettext.domain('gnome-shell-extensions-mediaplayer'); 23 | const Me = imports.misc.extensionUtils.getCurrentExtension(); 24 | const Lib = Me.imports.lib; 25 | const Manager = Me.imports.manager; 26 | const Panel = Me.imports.panel; 27 | const Settings = Me.imports.settings; 28 | 29 | /* global values */ 30 | let manager; 31 | let indicator; 32 | let _stockMpris; 33 | let _stockMprisOldShouldShow; 34 | 35 | function init() { 36 | Lib.initTranslations(Me); 37 | Lib.addIcon(Me); 38 | Settings.init(); 39 | if (Settings.MINOR_VERSION > 19) { 40 | //Monkey patch 41 | _stockMpris = Main.panel.statusArea.dateMenu._messageList._mediaSection; 42 | _stockMprisOldShouldShow = _stockMpris._shouldShow; 43 | } 44 | Settings.gsettings.connect("changed::" + Settings.MEDIAPLAYER_INDICATOR_POSITION_KEY, function() { 45 | _reset(); 46 | }); 47 | } 48 | 49 | function _reset() { 50 | if (manager) { 51 | disable(); 52 | enable(); 53 | } 54 | } 55 | 56 | function enable() { 57 | let position = Settings.gsettings.get_enum(Settings.MEDIAPLAYER_INDICATOR_POSITION_KEY), 58 | menu, desiredMenuPosition; 59 | 60 | if (position == Settings.IndicatorPosition.VOLUMEMENU) { 61 | indicator = new Panel.AggregateMenuIndicator(); 62 | menu = Main.panel.statusArea.aggregateMenu.menu; 63 | desiredMenuPosition = Main.panel.statusArea.aggregateMenu.menu._getMenuItems().indexOf(Main.panel.statusArea.aggregateMenu._rfkill.menu); 64 | } 65 | else { 66 | indicator = new Panel.PanelIndicator(); 67 | menu = indicator.menu; 68 | desiredMenuPosition = 0; 69 | } 70 | 71 | manager = new Manager.PlayerManager(menu, desiredMenuPosition); 72 | if (position == Settings.IndicatorPosition.LEFT) { 73 | Main.panel.addToStatusArea('mediaplayer', indicator, 999, 'left'); 74 | } 75 | else if (position == Settings.IndicatorPosition.RIGHT) { 76 | Main.panel.addToStatusArea('mediaplayer', indicator); 77 | } 78 | else if (position == Settings.IndicatorPosition.CENTER) { 79 | Main.panel.addToStatusArea('mediaplayer', indicator, 999, 'center'); 80 | } 81 | else { 82 | Main.panel.statusArea.aggregateMenu._indicators.insert_child_below(indicator.indicators, Main.panel.statusArea.aggregateMenu._screencast.indicators); 83 | } 84 | 85 | indicator.manager = manager; 86 | } 87 | 88 | function disable() { 89 | manager.destroy(); 90 | manager = null; 91 | if (indicator instanceof Panel.PanelIndicator) { 92 | indicator.destroy(); 93 | } 94 | else { 95 | indicator.indicators.destroy(); 96 | } 97 | indicator = null; 98 | if (Settings.MINOR_VERSION > 19) { 99 | //Revert Monkey patch 100 | _stockMpris._shouldShow = _stockMprisOldShouldShow; 101 | if (_stockMpris._shouldShow()) { 102 | _stockMpris.actor.show(); 103 | } 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /src/lib.js: -------------------------------------------------------------------------------- 1 | /* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */ 2 | /* jshint esnext: true */ 3 | /* jshint -W097 */ 4 | /* global imports: false */ 5 | /** 6 | This program is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 2 of the License, or 9 | (at your option) any later version. 10 | 11 | This program is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with this program. If not, see . 18 | **/ 19 | 20 | const Gtk = imports.gi.Gtk; 21 | const Gio = imports.gi.Gio; 22 | const Gettext = imports.gettext; 23 | 24 | function getSettings(extension) { 25 | let schemaName = 'org.gnome.shell.extensions.mediaplayer'; 26 | let schemaDir = extension.dir.get_child('schemas').get_path(); 27 | let schemaSource = Gio.SettingsSchemaSource.new_from_directory(schemaDir, 28 | Gio.SettingsSchemaSource.get_default(), 29 | false); 30 | let schema = schemaSource.lookup(schemaName, false); 31 | 32 | return new Gio.Settings({ settings_schema: schema }); 33 | } 34 | 35 | function initTranslations(extension) { 36 | let localeDir = extension.dir.get_child('locale').get_path(); 37 | Gettext.bindtextdomain('gnome-shell-extensions-mediaplayer', localeDir); 38 | } 39 | 40 | function addIcon(extension) { 41 | let iconPath = extension.dir.get_path(); 42 | Gtk.IconTheme.get_default().append_search_path(iconPath); 43 | } 44 | -------------------------------------------------------------------------------- /src/manager.js: -------------------------------------------------------------------------------- 1 | /* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */ 2 | /* jshint esnext: true */ 3 | /* jshint -W097 */ 4 | /* global imports: false */ 5 | /* global global: false */ 6 | /** 7 | This program is free software: you can redistribute it and/or modify 8 | it under the terms of the GNU General Public License as published by 9 | the Free Software Foundation, either version 2 of the License, or 10 | (at your option) any later version. 11 | 12 | This program is distributed in the hope that it will be useful, 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | GNU General Public License for more details. 16 | 17 | You should have received a copy of the GNU General Public License 18 | along with this program. If not, see . 19 | **/ 20 | 21 | const Mainloop = imports.mainloop; 22 | const Lang = imports.lang; 23 | const Signals = imports.signals; 24 | 25 | const Me = imports.misc.extensionUtils.getCurrentExtension(); 26 | const Panel = Me.imports.panel; 27 | const Player = Me.imports.player; 28 | const Settings = Me.imports.settings; 29 | const DBusIface = Me.imports.dbus; 30 | const UI = Me.imports.ui; 31 | 32 | 33 | var PlayerManager = class PlayerManager { 34 | 35 | constructor(menu, desiredMenuPosition) { 36 | this._disabling = false; 37 | // the menu 38 | this.menu = menu; 39 | this._settings = Settings.gsettings; 40 | this.desiredMenuPosition = desiredMenuPosition; 41 | this.menu.connect('open-state-changed', Lang.bind(this, function(menu, open) { 42 | let keepActiveOpen = this._settings.get_boolean(Settings.MEDIAPLAYER_KEEP_ACTIVE_OPEN_KEY); 43 | if (open && keepActiveOpen) { 44 | this.showActivePlayer(); 45 | } 46 | })); 47 | this._settingChangeId = this._settings.connect("changed::" + Settings.MEDIAPLAYER_KEEP_ACTIVE_OPEN_KEY, Lang.bind(this, function(settings, key) { 48 | if (settings.get_boolean(key)) { 49 | this.showActivePlayer(); 50 | } 51 | else { 52 | this.closeAllPlayers(); 53 | } 54 | })); 55 | // players list 56 | this._players = {}; 57 | this._addPlayerTimeOutIds = {}; 58 | // player shown in the panel 59 | this._activePlayer = null; 60 | this._activePlayerId = null; 61 | // the DBus interface 62 | this._dbus = new DBusIface.DBus(); 63 | // player DBus name pattern 64 | let name_regex = /^org\.mpris\.MediaPlayer2\./; 65 | // load players 66 | this._dbus.ListNamesRemote(Lang.bind(this, function(names) { 67 | let playerNames = []; 68 | for (let n in names[0]) { 69 | let name = names[0][n]; 70 | if (name_regex.test(name)) { 71 | playerNames.push(name); 72 | } 73 | } 74 | playerNames.sort(); 75 | for (let i in playerNames) { 76 | let player = playerNames[i]; 77 | this._dbus.GetNameOwnerRemote(player, Lang.bind(this, function(owner) { 78 | if (!this._disabling) { 79 | this._addPlayer(player, owner); 80 | } 81 | })); 82 | } 83 | })); 84 | // watch players 85 | this._ownerChangedId = this._dbus.connectSignal('NameOwnerChanged', Lang.bind(this, 86 | function(proxy, sender, [name, old_owner, new_owner]) { 87 | if (name_regex.test(name)) { 88 | if (!this._disabling) { 89 | if (new_owner && !old_owner) { 90 | this._addPlayer(name, new_owner); 91 | } 92 | else if (old_owner && !new_owner) { 93 | this._removePlayerFromMenu(name, old_owner); 94 | } 95 | else { 96 | this._changePlayerOwner(name, old_owner, new_owner); 97 | } 98 | } 99 | } 100 | } 101 | )); 102 | } 103 | 104 | get activePlayer() { 105 | return this._activePlayer; 106 | } 107 | 108 | set activePlayer(player) { 109 | 110 | if (player == this._activePlayer) 111 | return; 112 | 113 | if (player === null) { 114 | this._activePlayerId = null; 115 | this._activePlayer = null; 116 | this.emit('player-active-remove'); 117 | return; 118 | } 119 | 120 | if (this._activePlayerId) { 121 | this._activePlayer.disconnect(this._activePlayerId); 122 | this._activePlayerId = null; 123 | } 124 | this._activePlayer = player; 125 | this._activePlayerId = this._activePlayer.connect('player-update', 126 | Lang.bind(this, this._onActivePlayerUpdate)); 127 | let keepActiveOpen = this._settings.get_boolean(Settings.MEDIAPLAYER_KEEP_ACTIVE_OPEN_KEY); 128 | if (keepActiveOpen) { 129 | this.showActivePlayer(); 130 | } 131 | this.emit('player-active-update', player.state); 132 | } 133 | 134 | showActivePlayer() { 135 | if (!this._activePlayer || !this.menu.actor.visible) { 136 | return; 137 | } 138 | for (let owner in this._players) { 139 | if (this._players[owner].player == this._activePlayer && this._players[owner].ui.menu) { 140 | this._players[owner].ui.menu.open(); 141 | break; 142 | } 143 | } 144 | } 145 | 146 | closeAllPlayers() { 147 | for (let owner in this._players) { 148 | if (this._players[owner].ui.menu) { 149 | this._players[owner].ui.menu.close(); 150 | } 151 | } 152 | } 153 | 154 | nbPlayers() { 155 | return Object.keys(this._players).length; 156 | } 157 | 158 | getPlayersByStatus(status, preference) { 159 | // Return a list of running players by status and preference 160 | // preference is a player instance, if found in the list 161 | // it will be put in the first position 162 | return Object.keys(this._players).map(Lang.bind(this, function(owner) { 163 | return this._players[owner].player; 164 | })) 165 | .filter(function(player) { 166 | if (player && player.state.status == status) 167 | return true; 168 | else 169 | return false; 170 | }) 171 | .sort(function(a, b) { 172 | if (a == preference) 173 | return -1; 174 | else if (b == preference) 175 | return 1; 176 | return 0; 177 | }); 178 | } 179 | 180 | _isInstance(busName) { 181 | // MPRIS instances are in the form 182 | // org.mpris.MediaPlayer2.name.instanceXXXX 183 | // ...except for VLC, which to this day uses 184 | // org.mpris.MediaPlayer2.name-XXXX 185 | return busName.split('.').length > 4 || 186 | /^org\.mpris\.MediaPlayer2\.vlc-\d+$/.test(busName); 187 | } 188 | 189 | _addPlayer(busName, owner) { 190 | // Give players 1 sec to populate their interfaces before actually adding them. 191 | if (this._addPlayerTimeOutIds[busName] && this._addPlayerTimeOutIds[busName] !== 0) { 192 | Mainloop.source_remove(this._addPlayerTimeOutIds[busName]); 193 | this._addPlayerTimeOutIds[busName] = 0; 194 | } 195 | this._addPlayerTimeOutIds[busName] = Mainloop.timeout_add_seconds(1, Lang.bind(this, function() { 196 | this._addPlayerTimeOutIds[busName] = 0; 197 | if (this._players[owner]) { 198 | let prevName = this._players[owner].player.busName; 199 | // HAVE: ADDING: ACTION: 200 | // master master reject, cannot happen 201 | // master instance upgrade to instance 202 | // instance master reject, duplicate 203 | // instance instance reject, cannot happen 204 | if (this._isInstance(busName) && !this._isInstance(prevName)) 205 | this._players[owner].player.busName = busName; 206 | else 207 | return false; 208 | } 209 | else if (owner) { 210 | let player = new Player.MPRISPlayer(busName, owner); 211 | let ui = new UI.PlayerUI(player); 212 | this._players[owner] = { 213 | player: player, 214 | ui: ui, 215 | signals: [], 216 | signalsUI: [] 217 | }; 218 | if (this.nbPlayers() === 1) { 219 | this.emit('connect-signals'); 220 | } 221 | let playerItem = this._players[owner]; 222 | let playerUpdateId = playerItem.player.connect('player-update', Lang.bind(this, this._onPlayerUpdate)); 223 | playerItem.signals.push(playerUpdateId); 224 | this._addPlayerToMenu(owner); 225 | } 226 | return false; 227 | })); 228 | } 229 | 230 | _onPlayerUpdate(player, newState) { 231 | if (newState.status) 232 | this._refreshActivePlayer(player); 233 | } 234 | 235 | _onActivePlayerUpdate(player, newState) { 236 | this.emit('player-active-update', newState); 237 | } 238 | 239 | _addPlayerToMenu(owner) { 240 | let actualPos = this.desiredMenuPosition + this.nbPlayers(); 241 | let playerItem = this._players[owner]; 242 | this.menu.addMenuItem(playerItem.ui, actualPos); 243 | this._refreshActivePlayer(playerItem.player); 244 | } 245 | 246 | _getMenuItem(position) { 247 | let items = this.menu.box.get_children().map(function(actor) { 248 | return actor._delegate; 249 | }); 250 | if (items[position]) 251 | return items[position]; 252 | else 253 | return null; 254 | } 255 | 256 | _removeMenuItem(position) { 257 | let item = this._getMenuItem(position); 258 | if (item) 259 | item.destroy(); 260 | } 261 | 262 | _getPlayerMenuPosition(ui) { 263 | let items = this.menu.box.get_children().map(function(actor) { 264 | return actor._delegate; 265 | }); 266 | for (let i in items) { 267 | if (items[i] == ui) 268 | return i; 269 | } 270 | return null; 271 | } 272 | 273 | _removePlayerFromMenu(busName, owner) { 274 | if (this._players[owner]) { 275 | for (let id in this._players[owner].signals) 276 | this._players[owner].player.disconnect(this._players[owner].signals[id]); 277 | for (let id in this._players[owner].signalsUI) 278 | this._players[owner].ui.disconnect(this._players[owner].signalsUI[id]); 279 | if (this._players[owner].ui) 280 | this._players[owner].ui.destroy(); 281 | if (this._players[owner].player) 282 | this._players[owner].player.destroy(); 283 | delete this._players[owner]; 284 | } 285 | this._refreshActivePlayer(null); 286 | if (this.nbPlayers() === 0) { 287 | this.emit('disconnect-signals'); 288 | } 289 | } 290 | 291 | _changePlayerOwner(busName, oldOwner, newOwner) { 292 | if (this._players[oldOwner] && busName == this._players[oldOwner].player.busName) { 293 | this._players[newOwner] = this._players[oldOwner]; 294 | this._players[newOwner].player.owner = newOwner; 295 | delete this._players[oldOwner]; 296 | } 297 | this._refreshActivePlayer(this._players[newOwner].player); 298 | } 299 | 300 | _refreshActivePlayer(player) { 301 | // Display current status in the top panel 302 | if (this.nbPlayers() > 0) { 303 | // Get the first player 304 | // with status PLAY or PAUSE 305 | // else all players are stopped 306 | this.activePlayer = [] 307 | .concat( 308 | this.getPlayersByStatus(Settings.Status.PLAY, player), 309 | this.getPlayersByStatus(Settings.Status.PAUSE, player), 310 | this.getPlayersByStatus(Settings.Status.STOP, player) 311 | )[0] || null; 312 | } 313 | else { 314 | this.activePlayer = null; 315 | } 316 | } 317 | 318 | destroy() { 319 | this._disabling = true; 320 | this._settings.disconnect(this._settingChangeId); 321 | if (this._ownerChangedId) 322 | this._dbus.disconnectSignal(this._ownerChangedId); 323 | for (let owner in this._players) 324 | this._removePlayerFromMenu(null, owner); 325 | // Cancel all pending timeouts. Wouldn't want to try to add a player if we're disabled. 326 | for (let busName in this._addPlayerTimeOutIds) { 327 | if (this._addPlayerTimeOutIds[busName] !== 0) { 328 | Mainloop.source_remove(this._addPlayerTimeOutIds[busName]); 329 | this._addPlayerTimeOutIds[busName] = 0; 330 | } 331 | } 332 | } 333 | }; 334 | Signals.addSignalMethods(PlayerManager.prototype); 335 | -------------------------------------------------------------------------------- /src/meson.build: -------------------------------------------------------------------------------- 1 | install_data([ 2 | 'dbus.js', 3 | 'extension.js', 4 | 'lib.js', 5 | 'manager.js', 6 | 'panel.js', 7 | 'player.js', 8 | 'prefs.js', 9 | 'settings.js', 10 | 'stylesheet.css', 11 | 'ui.js', 12 | 'util.js', 13 | 'widget.js', 14 | 'metadata.json', 15 | 'mpi-symbolic.svg' 16 | ], 17 | install_dir: EXTENSION_DIR 18 | ) 19 | 20 | install_data( 21 | 'org.gnome.shell.extensions.mediaplayer.gschema.xml', 22 | install_dir : SCHEMA_DIR 23 | ) 24 | -------------------------------------------------------------------------------- /src/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "uuid": "mediaplayer@patapon.info", 3 | "name": "Media Player Indicator", 4 | "description": "Control MPRIS Version 2 Capable Media Players.", 5 | "original-author": "eon@patapon.info", 6 | "shell-version": ["3.32"], 7 | "url": "https://github.com/JasonLG1979/gnome-shell-extensions-mediaplayer/" 8 | } 9 | -------------------------------------------------------------------------------- /src/mpi-symbolic.svg: -------------------------------------------------------------------------------- 1 | 2 | 17 | 39 | 44 | 49 | 54 | 59 | 64 | 69 | 70 | 72 | 74 | 75 | 77 | image/svg+xml 78 | 80 | 81 | 82 | 83 | 84 | 87 | 92 | 97 | 98 | 99 | -------------------------------------------------------------------------------- /src/org.gnome.shell.extensions.mediaplayer.gschema.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 'volume-menu' 17 | Where to display the indicator (center, right, volume menu) 18 | 19 | 20 | false 21 | Always hide the indicator in the system menu 22 | Whether to always hide the indicator in the system menu. 23 | 24 | 25 | false 26 | Show the current tracks cover in the panel 27 | Show the current tracks cover in the panel instead of an icon. 28 | 29 | 30 | 'small' 31 | The style of the play control buttons 32 | 33 | 34 | false 35 | Show the media player volume slider 36 | Whether to show the volume control of the mediaplayers. 37 | 38 | 39 | true 40 | Show the media player position slider 41 | Whether to show the position slider of the mediaplayers. 42 | 43 | 44 | false 45 | Show media player playlists 46 | Whether to show the playlists of the mediaplayers. 47 | 48 | 49 | false 50 | Show the current Playlist Title in the main trackbox 51 | Whether to show the current Playlist Title in the main trackbox. 52 | 53 | 54 | false 55 | Show media player tracklist 56 | Whether to show the tracklist of the mediaplayers. 57 | 58 | 59 | false 60 | Display song rating 61 | Display the currently playing song's rating on a 0 to 5 scale 62 | 63 | 64 | false 65 | Display song ratings in the tracklist 66 | Display the ratings of the songs in tracklist on a 0 to 5 scale 67 | 68 | 69 | '' 70 | The indicator status text 71 | 72 | 73 | 300 74 | Status text size 75 | The the maximum width before the title gets an ellipsis. Default is 300px. 76 | 77 | 78 | true 79 | Show a play state icon in the indicator 80 | Show a play state icon in the indicator. 81 | 82 | 83 | true 84 | Show the media player in the volume menu 85 | Whether to show the mediaplayer controls in the volume menu. 86 | 87 | 88 | true 89 | Enable Indicator scroll events 90 | Enables track changes on scrolling the Indicator. 91 | 92 | 93 | false 94 | Hide the built-in Mpris applet 95 | Whether to hide the built-in Mpris applet. 96 | 97 | 98 | true 99 | Always keep the active player menu open 100 | Always keep the active player menu open. 101 | 102 | 103 | false 104 | Always show a Stop Button in the Player controls 105 | Always show a Stop Button in the Player controls. 106 | 107 | 108 | false 109 | Show shuffle and repeat buttons 110 | Show shuffle and repeat buttons. 111 | 112 | 113 | false 114 | Show a Play Status Icon for each Player 115 | Show a Play Status Icon for each Player. 116 | 117 | 118 | 119 | -------------------------------------------------------------------------------- /src/panel.js: -------------------------------------------------------------------------------- 1 | /* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */ 2 | /* jshint esnext: true */ 3 | /* jshint -W097 */ 4 | /* global imports: false */ 5 | /** 6 | This program is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 2 of the License, or 9 | (at your option) any later version. 10 | 11 | This program is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with this program. If not, see . 18 | **/ 19 | 20 | 'use strict'; 21 | 22 | const Lang = imports.lang; 23 | const Clutter = imports.gi.Clutter; 24 | const GObject = imports.gi.GObject; 25 | const Pango = imports.gi.Pango; 26 | const St = imports.gi.St; 27 | const PanelMenu = imports.ui.panelMenu; 28 | const Signals = imports.signals; 29 | 30 | const Me = imports.misc.extensionUtils.getCurrentExtension(); 31 | const Settings = Me.imports.settings; 32 | const Util = Me.imports.util; 33 | 34 | const IndicatorMixin = { 35 | 36 | set manager(manager) { 37 | this._manager = manager; 38 | this.manager.connect('player-active-update', Lang.bind(this, this._commonOnActivePlayerUpdate)); 39 | this.manager.connect('player-active-remove', Lang.bind(this, this._commonOnActivePlayerRemove)); 40 | this.manager.connect('connect-signals', Lang.bind(this, this._connectSignals)); 41 | this.manager.connect('disconnect-signals', Lang.bind(this, this._disconnectSignals)); 42 | }, 43 | 44 | get manager() { 45 | return this._manager; 46 | }, 47 | 48 | get state() { 49 | if (this.manager.activePlayer) { 50 | return this.manager.activePlayer.state; 51 | } 52 | return {}; 53 | }, 54 | 55 | _onScrollEvent: function(actor, event) { 56 | if (Settings.gsettings.get_boolean(Settings.MEDIAPLAYER_ENABLE_SCROLL_EVENTS_KEY)) { 57 | switch (event.get_scroll_direction()) { 58 | case Clutter.ScrollDirection.UP: 59 | this.manager.activePlayer.next(); 60 | break; 61 | case Clutter.ScrollDirection.DOWN: 62 | this.manager.activePlayer.previous(); 63 | break; 64 | } 65 | } 66 | }, 67 | 68 | _onButtonEvent: function(actor, event) { 69 | if (event.type() == Clutter.EventType.BUTTON_PRESS) { 70 | let button = event.get_button(); 71 | if (button == 2 && this.manager.activePlayer) { 72 | this.manager.activePlayer.playPause(); 73 | return Clutter.EVENT_STOP; 74 | } 75 | } 76 | return Clutter.EVENT_PROPAGATE; 77 | }, 78 | 79 | _connectSignals: function() { 80 | this._signalsId.push(this._settings.connect("changed::" + Settings.MEDIAPLAYER_COVER_STATUS_KEY, 81 | Lang.bind(this, function(settings, key) { 82 | this._useCoverInPanel = settings.get_boolean(key); 83 | this._updatePanel(); 84 | }))); 85 | this._signalsId.push(this._settings.connect("changed::" + Settings.MEDIAPLAYER_STATUS_TEXT_KEY, 86 | Lang.bind(this, function(settings, key) { 87 | this._stateTemplate = settings.get_string(key); 88 | this._updatePanel(); 89 | }))); 90 | this._signalsId.push(this._settings.connect("changed::" + Settings.MEDIAPLAYER_STATUS_SIZE_KEY, 91 | Lang.bind(this, function(settings, key) { 92 | this._prefWidth = settings.get_int(key); 93 | this._updatePanel(); 94 | }))); 95 | this._signalsId.push(this._settings.connect("changed::" + Settings.MEDIAPLAYER_PLAY_STATE_ICON_KEY, 96 | Lang.bind(this, function(settings, key) { 97 | this._showPlayStateIcon = settings.get_boolean(key); 98 | this._updatePanel(); 99 | }))); 100 | }, 101 | 102 | _disconnectSignals: function() { 103 | for (let id in this._signalsId) { 104 | this._settings.disconnect(this._signalsId[id]); 105 | } 106 | this._signalsId = []; 107 | }, 108 | 109 | // method binded to classes below 110 | _commonOnActivePlayerUpdate: function() { 111 | this._updatePanel(); 112 | this._onActivePlayerUpdate(this.state); 113 | }, 114 | 115 | _updatePanel: function() { 116 | let state = this.state; 117 | if (state.status && this._showPlayStateIcon) { 118 | if (state.status == Settings.Status.PLAY) { 119 | this._secondaryIndicator.icon_name = "media-playback-start-symbolic"; 120 | } 121 | else if (state.status == Settings.Status.PAUSE) { 122 | this._secondaryIndicator.icon_name = "media-playback-pause-symbolic"; 123 | } 124 | else if (state.status == Settings.Status.STOP) { 125 | this._secondaryIndicator.icon_name = "media-playback-stop-symbolic"; 126 | } 127 | this._secondaryIndicator.show(); 128 | this._secondaryIndicator.set_width(-1); 129 | this.indicators.show(); 130 | } else { 131 | this._secondaryIndicator.hide(); 132 | } 133 | 134 | if(this._stateTemplate.length === 0 || state.status == Settings.Status.STOP) { 135 | this._thirdIndicator.clutter_text.set_markup(''); 136 | this._statusTextWidth = 0; 137 | this._stateText = ''; 138 | this._thirdIndicator.hide(); 139 | } 140 | else if (state.playerName || state.trackTitle || state.trackArtist || state.trackAlbum) { 141 | let stateText = this.compileTemplate(this._stateTemplate, state); 142 | if (this._stateText != stateText) { 143 | this._stateText = stateText; 144 | this._thirdIndicator.clutter_text.set_markup(this._stateText); 145 | this._thirdIndicator.set_width(-1); 146 | this._statusTextWidth = this._thirdIndicator.get_width(); 147 | } 148 | let desiredwidth = Math.min(this._prefWidth, this._statusTextWidth); 149 | let currentWidth = this._thirdIndicator.get_width(); 150 | if (currentWidth != desiredwidth) { 151 | this._thirdIndicator.set_width(desiredwidth); 152 | } 153 | this._thirdIndicator.show(); 154 | } 155 | 156 | if (state.trackCoverUrl || state.desktopEntry) { 157 | let fallbackIcon = this.getPlayerSymbolicIcon(state.desktopEntry, 'mpi-symbolic'); 158 | if (this._useCoverInPanel) { 159 | this.setCoverIconAsync(this._primaryIndicator, state.trackCoverUrl, fallbackIcon, true); 160 | } 161 | else if (this._primaryIndicator.icon_name != fallbackIcon) { 162 | this._primaryIndicator.icon_name = fallbackIcon; 163 | } 164 | } 165 | }, 166 | 167 | _commonOnActivePlayerRemove: function() { 168 | this._primaryIndicator.icon_name = 'audio-x-generic-symbolic'; 169 | this._thirdIndicator.clutter_text.set_markup(''); 170 | this._thirdIndicator.set_width(0); 171 | this._secondaryIndicator.set_width(0); 172 | this._thirdIndicator.hide(); 173 | this._secondaryIndicator.hide(); 174 | this._onActivePlayerRemove(); 175 | } 176 | }; 177 | 178 | var PanelIndicator = GObject.registerClass(class PanelIndicator extends PanelMenu.Button { 179 | 180 | _init() { 181 | super._init(0.0, "mediaplayer"); 182 | 183 | this._manager = null; 184 | this.actor.add_style_class_name('panel-status-button'); 185 | this.menu.actor.add_style_class_name('aggregate-menu panel-media-indicator'); 186 | this.compileTemplate = Util.compileTemplate; 187 | this.setCoverIconAsync = Util.setCoverIconAsync; 188 | this.getPlayerSymbolicIcon = Util.getPlayerSymbolicIcon; 189 | 190 | this._settings = Settings.gsettings; 191 | this._useCoverInPanel = this._settings.get_boolean(Settings.MEDIAPLAYER_COVER_STATUS_KEY); 192 | this._stateTemplate = this._settings.get_string(Settings.MEDIAPLAYER_STATUS_TEXT_KEY); 193 | this._prefWidth = this._settings.get_int(Settings.MEDIAPLAYER_STATUS_SIZE_KEY); 194 | this._showPlayStateIcon = this._settings.get_boolean(Settings.MEDIAPLAYER_PLAY_STATE_ICON_KEY); 195 | this._statusTextWidth = 0; 196 | this._stateText = ''; 197 | this._signalsId = []; 198 | 199 | this.indicators = new St.BoxLayout({vertical: false, style_class: 'system-status-icon'}); 200 | 201 | this._primaryIndicator = new St.Icon({icon_name: 'audio-x-generic-symbolic', 202 | style_class: 'system-status-icon no-padding'}); 203 | this._secondaryIndicator = new St.Icon({icon_name: 'media-playback-stop-symbolic', 204 | style_class: 'system-status-icon no-padding'}); 205 | this._secondaryIndicator.hide(); 206 | this._thirdIndicator = new St.Label({style_class: 'system-status-icon no-padding'}); 207 | this._thirdIndicator.clutter_text.ellipsize = Pango.EllipsizeMode.END; 208 | this._thirdIndicatorBin = new St.Bin({child: this._thirdIndicator}); 209 | this._thirdIndicator.hide(); 210 | 211 | this.indicators.add(this._primaryIndicator); 212 | this.indicators.add(this._secondaryIndicator); 213 | this.indicators.add(this._thirdIndicatorBin); 214 | 215 | this.actor.add_actor(this.indicators); 216 | this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent)); 217 | this.actor.hide(); 218 | } 219 | 220 | // Override PanelMenu.Button._onEvent 221 | _onEvent(actor, event) { 222 | if (this._onButtonEvent(actor, event) == Clutter.EVENT_PROPAGATE) 223 | super._onEvent(actor, event); 224 | } 225 | 226 | _onActivePlayerUpdate(state) { 227 | if (this.manager.activePlayer) { 228 | this.actor.show(); 229 | } 230 | } 231 | 232 | _onActivePlayerRemove() { 233 | this.actor.hide(); 234 | } 235 | }); 236 | Util._extends(PanelIndicator, IndicatorMixin); 237 | 238 | var AggregateMenuIndicator = class AggregateMenuIndicator extends PanelMenu.SystemIndicator { 239 | 240 | constructor() { 241 | super(); 242 | 243 | this._manager = null; 244 | this.compileTemplate = Util.compileTemplate; 245 | this.setCoverIconAsync = Util.setCoverIconAsync; 246 | this.getPlayerSymbolicIcon = Util.getPlayerSymbolicIcon; 247 | this._settings = Settings.gsettings; 248 | this._useCoverInPanel = this._settings.get_boolean(Settings.MEDIAPLAYER_COVER_STATUS_KEY); 249 | this._stateTemplate = this._settings.get_string(Settings.MEDIAPLAYER_STATUS_TEXT_KEY); 250 | this._prefWidth = this._settings.get_int(Settings.MEDIAPLAYER_STATUS_SIZE_KEY); 251 | this._statusTextWidth = 0; 252 | this._stateText = ''; 253 | this._signalsId = []; 254 | this._primaryIndicator = this._addIndicator(); 255 | this._primaryIndicator.icon_name = 'audio-x-generic-symbolic'; 256 | this._primaryIndicator.style_class = 'system-status-icon no-padding'; 257 | this._secondaryIndicator = this._addIndicator(); 258 | this._secondaryIndicator.icon_name = 'media-playback-stop-symbolic'; 259 | this._secondaryIndicator.style_class = 'system-status-icon no-padding'; 260 | this._secondaryIndicator.hide(); 261 | this._thirdIndicator = new St.Label({style_class: 'system-status-icon no-padding'}); 262 | this._thirdIndicator.clutter_text.ellipsize = Pango.EllipsizeMode.END; 263 | this._thirdIndicator.hide(); 264 | this._thirdIndicatorBin = new St.Bin({child: this._thirdIndicator}); 265 | this.indicators.add_actor(this._thirdIndicatorBin); 266 | this.indicators.connect('scroll-event', Lang.bind(this, this._onScrollEvent)); 267 | this.indicators.connect('button-press-event', Lang.bind(this, this._onButtonEvent)); 268 | 269 | this.indicators.hide(); 270 | this._settings.connect("changed::" + Settings.MEDIAPLAYER_HIDE_AGGINDICATOR_KEY, Lang.bind(this, function() { 271 | let alwaysHide = this._settings.get_boolean(Settings.MEDIAPLAYER_HIDE_AGGINDICATOR_KEY); 272 | if (alwaysHide) { 273 | this.indicators.hide(); 274 | } 275 | else if (this.manager.activePlayer && this.manager.activePlayer.state.status != Settings.Status.STOP) { 276 | this.indicators.show(); 277 | } 278 | })); 279 | } 280 | 281 | _onActivePlayerUpdate(state) { 282 | let alwaysHide = this._settings.get_boolean(Settings.MEDIAPLAYER_HIDE_AGGINDICATOR_KEY); 283 | if (state.status && state.status === Settings.Status.STOP || alwaysHide) { 284 | this.indicators.hide(); 285 | } 286 | else if (state.status && !alwaysHide) { 287 | this.indicators.show(); 288 | } 289 | } 290 | 291 | _onActivePlayerRemove() { 292 | this.indicators.hide(); 293 | } 294 | }; 295 | Util._extends(AggregateMenuIndicator, IndicatorMixin); 296 | -------------------------------------------------------------------------------- /src/settings.js: -------------------------------------------------------------------------------- 1 | /* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */ 2 | /* jshint esnext: true */ 3 | /* jshint -W097 */ 4 | /* global imports: false */ 5 | /** 6 | This program is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 2 of the License, or 9 | (at your option) any later version. 10 | 11 | This program is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with this program. If not, see . 18 | **/ 19 | 20 | 'use strict'; 21 | 22 | const Me = imports.misc.extensionUtils.getCurrentExtension(); 23 | const Lib = Me.imports.lib; 24 | 25 | const Config = imports.misc.config; 26 | 27 | const Gettext = imports.gettext.domain('gnome-shell-extensions-mediaplayer'); 28 | const _ = Gettext.gettext; 29 | 30 | var MEDIAPLAYER_INDICATOR_POSITION_KEY = 'indicator-position'; 31 | var MEDIAPLAYER_COVER_STATUS_KEY = 'cover-status'; 32 | var MEDIAPLAYER_STATUS_TEXT_KEY = 'status-text'; 33 | var MEDIAPLAYER_STATUS_SIZE_KEY = 'status-size'; 34 | var MEDIAPLAYER_PLAY_STATE_ICON_KEY = 'play-state-icon'; 35 | var MEDIAPLAYER_VOLUME_KEY = 'volume'; 36 | var MEDIAPLAYER_HIDE_AGGINDICATOR_KEY = 'hide-aggindicator'; 37 | var MEDIAPLAYER_POSITION_KEY = 'position'; 38 | var MEDIAPLAYER_PLAYLISTS_KEY = 'playlists'; 39 | var MEDIAPLAYER_STOP_BUTTON_KEY = 'stop-button'; 40 | var MEDIAPLAYER_BUTTON_ICON_STYLE_KEY = 'button-icon-style'; 41 | var MEDIAPLAYER_PLAYLIST_TITLE_KEY = 'playlist-title'; 42 | var MEDIAPLAYER_TRACKLIST_KEY = 'tracklist'; 43 | var MEDIAPLAYER_TRACKLIST_RATING_KEY = 'tracklist-rating'; 44 | var MEDIAPLAYER_LOOP_STATUS_KEY = 'loop-status'; 45 | var MEDIAPLAYER_RATING_KEY = 'rating'; 46 | var MEDIAPLAYER_ENABLE_SCROLL_EVENTS_KEY = 'enable-scroll'; 47 | var MEDIAPLAYER_HIDE_STOCK_MPRIS_KEY = 'hide-stockmpris'; 48 | var MEDIAPLAYER_KEEP_ACTIVE_OPEN_KEY = 'active-open'; 49 | var MEDIAPLAYER_PLAY_STATUS_ICON_KEY = 'playstatus'; 50 | 51 | var MINOR_VERSION = parseInt(Config.PACKAGE_VERSION.split(".")[1]); 52 | 53 | var IndicatorPosition = { 54 | LEFT: 3, 55 | CENTER: 0, 56 | RIGHT: 1, 57 | VOLUMEMENU: 2 58 | }; 59 | 60 | var ButtonIconStyles = { 61 | CIRCULAR: 0, 62 | SMALL: 1, 63 | MEDIUM: 2, 64 | LARGE: 3 65 | }; 66 | 67 | var Status = { 68 | STOP: "Stopped", 69 | PLAY: "Playing", 70 | PAUSE: "Paused" 71 | }; 72 | 73 | var ValidPlaybackStatuses = [ 74 | 'Stopped', 75 | 'Playing', 76 | 'Paused' 77 | ]; 78 | 79 | var SUPPORTS_RATINGS_EXTENSION = [ 80 | "org.mpris.MediaPlayer2.Lollypop" 81 | ]; 82 | 83 | var WRONG_VOLUME_SCALING = [ 84 | "org.mpris.MediaPlayer2.quodlibet" 85 | ]; 86 | 87 | var ALTERNATIVE_PLAYLIST_TITLES = [ 88 | {"org.mpris.MediaPlayer2.pithos": _("Stations")} 89 | ]; 90 | 91 | var ALTERNATIVE_TRACKLIST_TITLES = [ 92 | {"org.mpris.MediaPlayer2.pithos": _("Current Playlist")} 93 | ]; 94 | 95 | var BROKEN_PLAYERS = [ 96 | "org.mpris.MediaPlayer2.spotify" 97 | ]; 98 | 99 | var NO_LOOP_STATUS_SUPPORT = [ 100 | "org.mpris.MediaPlayer2.quodlibet", 101 | "org.mpris.MediaPlayer2.pithos", 102 | "org.mpris.MediaPlayer2.spotify" 103 | ]; 104 | 105 | var gsettings; 106 | 107 | function init() { 108 | gsettings = Lib.getSettings(Me); 109 | } 110 | -------------------------------------------------------------------------------- /src/stylesheet.css: -------------------------------------------------------------------------------- 1 | /* Keep the vertical spacing on the Now Playing "row" containers but 2 | * remove left/right spacing 3 | */ 4 | .album-details { 5 | margin-left: 35px; 6 | margin-right: 35px; 7 | padding-left: 0; 8 | padding-right: 0; 9 | spacing: 0; 10 | } 11 | 12 | .album-details.slider-row { 13 | spacing: 12px; 14 | } 15 | 16 | /* 17 | * Everything within a row defaults to no spacing. 18 | * 19 | * Some widgets get overridden later 20 | */ 21 | .album-details * { 22 | margin: 0; 23 | padding: 0; 24 | } 25 | 26 | /* 27 | * Ideally we'd remove the spacer boxes by using a different widget type 28 | * but it isn't clear that Gnome Shell supports it. 29 | */ 30 | .album-details > :first-child { 31 | width: 0px; 32 | } 33 | 34 | .player-buttons { 35 | spacing: 2px; 36 | } 37 | 38 | .album-details .popup-menu-icon { 39 | padding: 0 4px; 40 | } 41 | 42 | .album-details .medium-player-button { 43 | padding: 0 6px; 44 | } 45 | .album-details .large-player-button { 46 | padding: 0 8px; 47 | } 48 | 49 | .album-details .system-menu-action { 50 | padding: 13px; 51 | } 52 | 53 | .album-details .system-menu-action:hover { 54 | padding: 14px; 55 | } 56 | 57 | .panel-media-indicator { 58 | min-width: 288px; 59 | max-width: 288px; 60 | } 61 | 62 | .large-cover-icon { 63 | icon-size: 128px !important; 64 | } 65 | 66 | .small-cover-icon { 67 | icon-size: 48px !important; 68 | } 69 | 70 | .no-padding { 71 | padding: 0px; 72 | } 73 | 74 | .no-padding-top { 75 | padding-top: 0px; 76 | } 77 | 78 | .no-padding-bottom { 79 | padding-bottom: 0px; 80 | } 81 | 82 | .pithos-rating-box { 83 | spacing: 6px; 84 | } 85 | 86 | .track-info-artist { 87 | font-weight: bold; 88 | } 89 | 90 | .track-info-title { 91 | font-size: small; 92 | } 93 | 94 | .track-info-album { 95 | font-size: x-small; 96 | } 97 | 98 | .album-details .star-icon { 99 | padding-top: 0px; 100 | padding-bottom: 0px; 101 | padding-left: 0.5px; 102 | padding-right: 0.5px; 103 | } 104 | -------------------------------------------------------------------------------- /src/ui.js: -------------------------------------------------------------------------------- 1 | /* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */ 2 | /* jshint esnext: true */ 3 | /* jshint -W097 */ 4 | /* global imports: false */ 5 | /* global global: false */ 6 | /** 7 | This program is free software: you can redistribute it and/or modify 8 | it under the terms of the GNU General Public License as published by 9 | the Free Software Foundation, either version 2 of the License, or 10 | (at your option) any later version. 11 | 12 | This program is distributed in the hope that it will be useful, 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | GNU General Public License for more details. 16 | 17 | You should have received a copy of the GNU General Public License 18 | along with this program. If not, see . 19 | **/ 20 | 21 | 'use strict'; 22 | 23 | const Gio = imports.gi.Gio; 24 | const Gtk = imports.gi.Gtk; 25 | const Lang = imports.lang; 26 | const St = imports.gi.St; 27 | const Main = imports.ui.main; 28 | 29 | const Gettext = imports.gettext.domain('gnome-shell-extensions-mediaplayer'); 30 | const _ = Gettext.gettext; 31 | 32 | const Me = imports.misc.extensionUtils.getCurrentExtension(); 33 | const Widget = Me.imports.widget; 34 | const Settings = Me.imports.settings; 35 | const Util = Me.imports.util; 36 | 37 | 38 | var PlayerUI = class PlayerUI extends Widget.PlayerMenu { 39 | 40 | constructor(player) { 41 | super('', true); 42 | this.hidePlayStatusIcon(); 43 | this.player = player; 44 | this.setCoverIconAsync = Util.setCoverIconAsync; 45 | this._updateId = player.connect('player-update', Lang.bind(this, this.update)); 46 | 47 | this.oldShouldShow = null; 48 | 49 | this.playlistTitle = new Widget.PlaylistTitle(); 50 | this.playlistTitle.connect('activate', Lang.bind(this.player, this.player.raise)); 51 | this.addMenuItem(this.playlistTitle); 52 | this.playlistTitle.hide(); 53 | 54 | this.trackCover = new Widget.TrackCover(new St.Icon({icon_name: 'audio-x-generic-symbolic', style_class: 'large-cover-icon'})); 55 | this.trackCover.connect('activate', Lang.bind(this.player, this.player.raise)); 56 | this.addMenuItem(this.trackCover); 57 | this.trackCover.hide(); 58 | 59 | this.trackRatings = new Widget.TrackRating(this.player); 60 | this.trackRatings.connect('activate', Lang.bind(this.player, this.player.raise)); 61 | this.addMenuItem(this.trackRatings); 62 | this.trackRatings.hide(); 63 | 64 | this.info = new Widget.Info(); 65 | this.info.connect('activate', Lang.bind(this.player, this.player.raise)); 66 | this.addMenuItem(this.info); 67 | 68 | this.trackControls = new Widget.PlayerButtons(); 69 | this.trackControls.connect('activate', Lang.bind(this.player, this.player.raise)); 70 | 71 | this.prevButton = new Widget.PlayerButton('media-skip-backward-symbolic', 72 | Lang.bind(this.player, this.player.previous)); 73 | this.trackControls.addButton(this.prevButton); 74 | 75 | this.playButton = new Widget.PlayerButton('media-playback-start-symbolic', 76 | Lang.bind(this.player, this.player.playPause)); 77 | this.trackControls.addButton(this.playButton); 78 | 79 | this.stopButton = new Widget.PlayerButton('media-playback-stop-symbolic', 80 | Lang.bind(this.player, this.player.stop)); 81 | this.trackControls.addButton(this.stopButton); 82 | 83 | this.nextButton = new Widget.PlayerButton('media-skip-forward-symbolic', 84 | Lang.bind(this.player, this.player.next)); 85 | this.trackControls.addButton(this.nextButton); 86 | 87 | this.addMenuItem(this.trackControls); 88 | 89 | this.shuffleLoopStatus = new Widget.ShuffleLoopStatus(this.player); 90 | this.shuffleLoopStatus.connect('activate', Lang.bind(this.player, this.player.raise)); 91 | this.addMenuItem(this.shuffleLoopStatus); 92 | this.shuffleLoopStatus.hide(); 93 | 94 | this.position = new Widget.SliderItem('document-open-recent-symbolic'); 95 | this.position.connect('activate', Lang.bind(this.player, this.player.raise)); 96 | this.position.sliderConnect('value-changed', Lang.bind(this, function(item) { 97 | this.player.seek(item._value); 98 | })); 99 | this.addMenuItem(this.position); 100 | this.position.hide(); 101 | 102 | this.volume = new Widget.SliderItem('audio-volume-high-symbolic'); 103 | this.volume.connect('activate', Lang.bind(this.player, this.player.raise)); 104 | this.volume.sliderConnect('value-changed', Lang.bind(this, function(item) { 105 | if (this.player.volume != item._value) { 106 | this.player.volume = item._value; 107 | } 108 | })); 109 | this.addMenuItem(this.volume); 110 | this.volume.hide(); 111 | 112 | this.tracklist = this._createTracklistWidget(); 113 | this.addMenuItem(this.tracklist); 114 | this.tracklist.hide(); 115 | 116 | this.playlists = this._createPlaylistWidget(); 117 | this.addMenuItem(this.playlists); 118 | this.playlists.hide(); 119 | 120 | this.tracklist.menu.connect('open-state-changed', Lang.bind(this, function(menu, open) { 121 | if (open) { 122 | this.playlists.menu.close(); 123 | } 124 | })); 125 | this.playlists.menu.connect('open-state-changed', Lang.bind(this, function(menu, open) { 126 | if (open) { 127 | this.tracklist.menu.close(); 128 | } 129 | })); 130 | 131 | if (Settings.MINOR_VERSION > 19) { 132 | this.stockMpris = Main.panel.statusArea.dateMenu._messageList._mediaSection; 133 | //Monkey patch 134 | this.stockMprisOldShouldShow = this.stockMpris._shouldShow; 135 | 136 | } 137 | } 138 | 139 | get state() { 140 | return this.player.state; 141 | } 142 | 143 | update(player, newState) { 144 | if (newState.desktopEntry !== null) { 145 | this.icon.icon_name = Util.getPlayerSymbolicIcon(this.state.desktopEntry); 146 | } 147 | 148 | if (newState.playerName !== null) { 149 | this.label.text = this.state.playerName; 150 | } 151 | 152 | if (newState.hideStockMpris !== null) { 153 | if (this.stockMpris) { 154 | if (newState.hideStockMpris) { 155 | this.stockMpris._shouldShow = function() {return false;}; 156 | this.stockMpris.actor.hide(); 157 | } 158 | else { 159 | this.stockMpris._shouldShow = this.stockMprisOldShouldShow; 160 | if (this.stockMpris._shouldShow()) { 161 | this.stockMpris.actor.show(); 162 | } 163 | } 164 | } 165 | } 166 | 167 | if (newState.isRhythmboxStream !== null) { 168 | if (this.state.isRhythmboxStream) { 169 | this.trackCover.hideAnimate(); 170 | this.trackRatings.hideAnimate(); 171 | this.position.hideAnimate(); 172 | this.shuffleLoopStatus.hideAnimate(); 173 | } 174 | if (this.state.showLoopStatus 175 | && !this.state.isRhythmboxStream 176 | && this.state.status !== Settings.Status.STOP) { 177 | this.shuffleLoopStatus.showAnimate(); 178 | } 179 | } 180 | 181 | if (newState.showPlayStatusIcon !== null) { 182 | if (this.state.showPlayStatusIcon) { 183 | this.showPlayStatusIcon(); 184 | } 185 | else { 186 | this.hidePlayStatusIcon(); 187 | } 188 | } 189 | 190 | if (newState.showRating !== null) { 191 | if (this.player.showRating 192 | && this.state.showRating !== 'no rating' 193 | && !this.state.isRhythmboxStream 194 | && this.state.status !== Settings.Status.STOP) { 195 | this.trackRatings.showAnimate(); 196 | } 197 | else { 198 | this.trackRatings.hideAnimate(); 199 | } 200 | } 201 | 202 | if (newState.showVolume !== null) { 203 | if (this.state.showVolume) { 204 | this.volume.showAnimate(); 205 | } 206 | else { 207 | this.volume.hideAnimate(); 208 | } 209 | } 210 | 211 | if (newState.buttonIconStyle !== null) { 212 | this.prevButton.setIconSize(this.state.buttonIconStyle); 213 | this.playButton.setIconSize(this.state.buttonIconStyle); 214 | this.stopButton.setIconSize(this.state.buttonIconStyle); 215 | this.nextButton.setIconSize(this.state.buttonIconStyle); 216 | } 217 | 218 | if (newState.shuffle !== null) { 219 | this.shuffleLoopStatus.setShuffle(this.state.shuffle); 220 | } 221 | 222 | if (newState.loopStatus !== null) { 223 | this.shuffleLoopStatus.setLoopStaus(this.state.loopStatus); 224 | } 225 | 226 | if (newState.showLoopStatus !== null) { 227 | if (!this.state.showLoopStatus) { 228 | this.shuffleLoopStatus.hideAnimate(); 229 | } 230 | if (this.state.showLoopStatus 231 | && !this.state.isRhythmboxStream 232 | && this.state.status !== Settings.Status.STOP) { 233 | this.shuffleLoopStatus.showAnimate(); 234 | } 235 | } 236 | 237 | if (newState.showPlaylistTitle !== null) { 238 | if (this.state.showPlaylistTitle && this.state.playlistTitle) { 239 | this.playlistTitle.showAnimate(); 240 | } 241 | else { 242 | this.playlistTitle.hideAnimate(); 243 | } 244 | } 245 | 246 | if (newState.playlistTitle !== null) { 247 | if (this.state.showPlaylistTitle && this.state.playlistTitle) { 248 | this.playlistTitle.update(this.state.playlistTitle); 249 | this.playlistTitle.showAnimate(); 250 | } 251 | else { 252 | this.playlistTitle.hideAnimate(); 253 | } 254 | } 255 | 256 | if (newState.showPosition !== null) { 257 | if (this.state.showPosition 258 | && this.state.trackLength !== 0 259 | && this.state.status !== Settings.Status.STOP 260 | && !this.state.isRhythmboxStream) { 261 | this.position.showAnimate(); 262 | } 263 | else { 264 | this.position.hideAnimate(); 265 | } 266 | } 267 | 268 | if (newState.playlistCount !== null) { 269 | if (this.state.showPlaylist && this.state.playlistCount > 0) { 270 | this.playlists.showAnimate(); 271 | } 272 | else { 273 | this.playlists.hideAnimate(); 274 | } 275 | } 276 | 277 | if (newState.showPlaylist !== null) { 278 | if (this.state.showPlaylist && this.state.playlistCount > 0) { 279 | this.playlists.showAnimate(); 280 | } 281 | else { 282 | this.playlists.hideAnimate(); 283 | } 284 | } 285 | 286 | if (newState.showTracklist !== null) { 287 | if (this.state.hasTrackList && this.state.showTracklist) { 288 | this.tracklist.showAnimate(); 289 | } 290 | else { 291 | this.tracklist.hideAnimate(); 292 | } 293 | } 294 | 295 | if (newState.hasTrackList !== null) { 296 | if (this.state.hasTrackList && this.state.showTracklist) { 297 | this.tracklist.showAnimate(); 298 | } 299 | else { 300 | this.tracklist.hideAnimate(); 301 | } 302 | } 303 | 304 | if (newState.trackRating !== null) { 305 | if (this.state.trackRating !== 'no rating') { 306 | this.trackRatings.rate(this.state.trackRating); 307 | if (this.state.showRating 308 | && !this.state.isRhythmboxStream 309 | && this.state.status !== Settings.Status.STOP) { 310 | this.trackRatings.showAnimate(); 311 | } 312 | } 313 | else { 314 | let dummyRating = this.player._pithosRatings ? '' : 0; 315 | this.trackRatings.rate(dummyRating); 316 | this.trackRatings.hideAnimate(); 317 | } 318 | } 319 | 320 | if (newState.trackArtist !== null) { 321 | this.info.update(this.state); 322 | } 323 | 324 | if (newState.volume !== null) { 325 | // Adapted from https://github.com/GNOME/gnome-shell/blob/master/js/ui/status/volume.js 326 | // So that our icon changes match the system volume icon changes. 327 | let value = this.state.volume, volumeIcon; 328 | if (value === 0) { 329 | volumeIcon = 'audio-volume-muted-symbolic'; 330 | } 331 | else { 332 | let n = Math.floor(3 * value) + 1; 333 | if (n < 2) { 334 | volumeIcon = 'audio-volume-low-symbolic'; 335 | } 336 | else if (n >= 3) { 337 | volumeIcon = 'audio-volume-high-symbolic'; 338 | } 339 | else { 340 | volumeIcon = 'audio-volume-medium-symbolic'; 341 | } 342 | } 343 | this.volume.setIcon(volumeIcon); 344 | this.volume.setValue(value); 345 | } 346 | 347 | if (newState.canGoNext !== null) { 348 | if (this.state.canGoNext) { 349 | this.nextButton.enable(); 350 | } 351 | else { 352 | this.nextButton.disable(); 353 | } 354 | if (!this.state.canGoNext 355 | && !this.state.canGoPrevious 356 | && !this.state.canPlay 357 | && !this.state.canPause) { 358 | this.stopButton.disable(); 359 | } 360 | else { 361 | this.stopButton.enable(); 362 | } 363 | } 364 | 365 | if (newState.canGoPrevious !== null) { 366 | if (this.state.canGoPrevious) { 367 | this.prevButton.enable(); 368 | } 369 | else { 370 | this.prevButton.disable(); 371 | } 372 | if (!this.state.canGoNext 373 | && !this.state.canGoPrevious 374 | && !this.state.canPlay 375 | && !this.state.canPause) { 376 | this.stopButton.disable(); 377 | } 378 | else { 379 | this.stopButton.enable(); 380 | } 381 | } 382 | 383 | if (newState.canSeek !== null) { 384 | this.position.setReactive(this.state.canSeek); 385 | } 386 | 387 | if (newState.canPlay !== null) { 388 | if (this.state.status !== Settings.Status.PLAY) { 389 | if (this.state.canPlay) { 390 | this.playButton.enable(); 391 | } 392 | else { 393 | this.playButton.disable(); 394 | } 395 | } 396 | if (!this.state.canGoNext 397 | && !this.state.canGoPrevious 398 | && !this.state.canPlay 399 | && !this.state.canPause) { 400 | this.stopButton.disable(); 401 | } 402 | else { 403 | this.stopButton.enable(); 404 | } 405 | } 406 | 407 | if (newState.canPause !== null) { 408 | if (this.state.status === Settings.Status.PLAY) { 409 | if (this.state.canPause) { 410 | this.playButton.enable(); 411 | if (!this.state.showStopButton) { 412 | this.stopButton.hide(); 413 | } 414 | } 415 | else if (!this.player.playerIsBroken) { 416 | // If we're playing, we can't pause, and the player isn't broken 417 | // we should show the stop button no matter what. 418 | this.stopButton.show(); 419 | this.playButton.disable(); 420 | } 421 | } 422 | if (!this.state.canGoNext 423 | && !this.state.canGoPrevious 424 | && !this.state.canPlay 425 | && !this.state.canPause) { 426 | this.stopButton.disable(); 427 | } 428 | else { 429 | this.stopButton.enable(); 430 | } 431 | } 432 | 433 | if (newState.trackTime !== null) { 434 | if (this.state.trackLength === 0) { 435 | this.position.hideAnimate(); 436 | } 437 | else if (this.state.status !== Settings.Status.STOP 438 | && this.state.showPosition 439 | && !this.state.isRhythmboxStream) { 440 | this.position.setValue(this.state.trackTime / this.state.trackLength); 441 | this.position.showAnimate(); 442 | } 443 | } 444 | 445 | if (newState.status !== null) { 446 | if (this.state.status === Settings.Status.PLAY) { 447 | this.setPlayStatusIcon('media-playback-start-symbolic'); 448 | this.playButton.setIcon('media-playback-pause-symbolic'); 449 | if (this.state.canPause) { 450 | this.playButton.enable(); 451 | if (!this.showStopButton) { 452 | this.stopButton.hide(); 453 | } 454 | } 455 | else if (!this.player.playerIsBroken) { 456 | // If we're playing, we can't pause, and the player isn't broken 457 | // we should show the stop button no matter what. 458 | this.stopButton.show(); 459 | this.playButton.disable(); 460 | } 461 | } 462 | else { 463 | this.playButton.setIcon('media-playback-start-symbolic'); 464 | if (this.state.canPlay) { 465 | this.playButton.enable(); 466 | } 467 | else { 468 | this.playButton.disable(); 469 | } 470 | } 471 | if (this.state.status === Settings.Status.STOP) { 472 | this.setPlayStatusIcon('media-playback-stop-symbolic'); 473 | this.stopButton.hide(); 474 | this.position.hideAnimate(); 475 | this.shuffleLoopStatus.hideAnimate(); 476 | this.trackRatings.hideAnimate(); 477 | this.info.hideAnimate(); 478 | this.trackCover.hideAnimate(); 479 | } 480 | else { 481 | if (this.state.showStopButton) { 482 | this.stopButton.show(); 483 | } 484 | if (!this.state.isRhythmboxStream) { 485 | this.trackCover.showAnimate(); 486 | } 487 | if (this.state.showRating 488 | && !this.state.isRhythmboxStream 489 | && this.state.trackRating !== 'no rating') { 490 | this.trackRatings.showAnimate(); 491 | } 492 | this.info.showAnimate(); 493 | if (this.state.showPosition 494 | && this.state.trackLength !== 0 495 | && !this.state.isRhythmboxStream) { 496 | this.position.showAnimate(); 497 | } 498 | } 499 | 500 | if (this.state.status === Settings.Status.PAUSE) { 501 | this.setPlayStatusIcon('media-playback-pause-symbolic'); 502 | } 503 | 504 | if (this.state.showLoopStatus 505 | && !this.state.isRhythmboxStream 506 | && this.state.status !== Settings.Status.STOP) { 507 | this.shuffleLoopStatus.showAnimate(); 508 | } 509 | } 510 | 511 | if (newState.showStopButton !== null) { 512 | if (this.state.showStopButton && this.state.status !== Settings.Status.STOP) { 513 | this.stopButton.show(); 514 | } 515 | else if (this.state.status === Settings.Status.PLAY && this.state.canPause) { 516 | this.stopButton.hide(); 517 | } 518 | } 519 | 520 | if (newState.trackCoverUrl !== null) { 521 | if (!this.state.isRhythmboxStream 522 | && this.state.status !== Settings.Status.STOP) { 523 | this.trackCover.showAnimate(); 524 | } 525 | this.setCoverIconAsync(this.trackCover.icon, 526 | this.state.trackCoverUrl, 527 | '', this.player.isClementine, 528 | this.trackCover.animating); 529 | } 530 | 531 | if (newState.playlists !== null) { 532 | this.playlists.loadPlaylists(this.state.playlists); 533 | } 534 | 535 | if (newState.trackListMetaData !== null) { 536 | this.tracklist.loadTracklist(this.state.trackListMetaData, this.state.showTracklistRating); 537 | } 538 | 539 | if (newState.showTracklistRating !== null) { 540 | this.tracklist.showRatings(this.state.showTracklistRating); 541 | } 542 | 543 | if (newState.playlistObj !== null) { 544 | this.playlists.setObjectActive(this.state.playlistObj); 545 | } 546 | 547 | if (newState.updatedPlaylist !== null) { 548 | let [playlistObj, playlistTitle] = this.state.updatedPlaylist; 549 | if (playlistObj == this.playlists.activeObject) { 550 | this.playlistTitle.update(playlistTitle); 551 | } 552 | this.playlists.updatePlaylist(this.state.updatedPlaylist); 553 | } 554 | 555 | if (newState.trackObj !== null) { 556 | this.tracklist.setObjectActive(this.state.trackObj); 557 | } 558 | 559 | if (newState.updatedMetadata !== null) { 560 | this.tracklist.updateMetadata(this.state.updatedMetadata); 561 | } 562 | } 563 | 564 | _createPlaylistWidget() { 565 | let playlistTitle = _("Playlists"); 566 | let altPlaylistTitles = Settings.ALTERNATIVE_PLAYLIST_TITLES; 567 | for (let i = 0; i < altPlaylistTitles.length; i++) { 568 | let obj = altPlaylistTitles[i]; 569 | for (let key in obj){ 570 | if (key == this.player.busName) { 571 | playlistTitle = obj[key]; 572 | break; 573 | } 574 | } 575 | } 576 | return new Widget.Playlists(playlistTitle, this.player); 577 | } 578 | 579 | _createTracklistWidget() { 580 | let tracklistTitle = _("Tracks"); 581 | let altTracklistTitles = Settings.ALTERNATIVE_TRACKLIST_TITLES; 582 | for (let i = 0; i < altTracklistTitles.length; i++) { 583 | let obj = altTracklistTitles[i]; 584 | for (let key in obj){ 585 | if (key == this.player.busName) { 586 | tracklistTitle = obj[key]; 587 | break; 588 | } 589 | } 590 | } 591 | return new Widget.TrackList(tracklistTitle, this.player); 592 | } 593 | 594 | toString() { 595 | return '[object PlayerUI(%s)]'.format(this.player.busName); 596 | } 597 | 598 | destroy() { 599 | if (this._updateId) { 600 | this.player.disconnect(this._updateId); 601 | } 602 | super.destroy(); 603 | } 604 | }; 605 | -------------------------------------------------------------------------------- /src/util.js: -------------------------------------------------------------------------------- 1 | /* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */ 2 | /* jshint esnext: true */ 3 | /* jshint -W097 */ 4 | /* global imports: false */ 5 | /** 6 | This program is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 2 of the License, or 9 | (at your option) any later version. 10 | 11 | This program is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with this program. If not, see . 18 | **/ 19 | 20 | const Mainloop = imports.mainloop; 21 | const Gio = imports.gi.Gio; 22 | const GLib = imports.gi.GLib; 23 | const Gtk = imports.gi.Gtk; 24 | const Pango = imports.gi.Pango; 25 | const Tweener = imports.ui.tweener; 26 | 27 | 28 | function setCoverIconAsync(icon, coverUrl, fallback_icon_name, dontAnimate, delay) { 29 | fallback_icon_name = (fallback_icon_name || 'audio-x-generic-symbolic'); 30 | if (coverUrl) { 31 | let file = Gio.File.new_for_uri(coverUrl); 32 | file.load_contents_async(null, function(source, result) { 33 | try { 34 | let bytes = source.load_contents_finish(result)[1]; 35 | let newIcon = Gio.BytesIcon.new(bytes); 36 | if (!newIcon.equal(icon.gicon)) { 37 | if (dontAnimate) { 38 | icon.gicon = newIcon; 39 | } 40 | else if (delay) { 41 | Mainloop.timeout_add(250, function() { 42 | animateChange(icon, 'gicon', newIcon); 43 | return false; 44 | }); 45 | } 46 | else { 47 | animateChange(icon, 'gicon', newIcon); 48 | } 49 | } 50 | } 51 | catch(err) { 52 | if (icon.icon_name != fallback_icon_name) { 53 | if (dontAnimate) { 54 | icon.icon_name = fallback_icon_name; 55 | } 56 | else if (delay) { 57 | Mainloop.timeout_add(250, function() { 58 | animateChange(icon, 'icon_name', fallback_icon_name); 59 | return false; 60 | }); 61 | } 62 | else { 63 | animateChange(icon, 'icon_name', fallback_icon_name); 64 | } 65 | } 66 | } 67 | }); 68 | } 69 | else if (icon.icon_name != fallback_icon_name) { 70 | if (dontAnimate) { 71 | icon.icon_name = fallback_icon_name; 72 | } 73 | else { 74 | animateChange(icon, 'icon_name', fallback_icon_name); 75 | } 76 | } 77 | } 78 | 79 | function animateChange(actor, prop, value) { 80 | Tweener.addTween(actor, { 81 | opacity: 0, 82 | time: 0.125, 83 | onComplete: function() { 84 | actor[prop] = value; 85 | Tweener.addTween(actor, { 86 | opacity: 255, 87 | time: 0.125 88 | }); 89 | } 90 | }); 91 | } 92 | 93 | function getPlayerSymbolicIcon(desktopEntry, fallback) { 94 | if (desktopEntry) { 95 | //The Player's symbolic Icon name *should* be it's 96 | //Desktop Entry + '-symbolic'. 97 | //For example, Pithos: 98 | //Desktop Entry - 'io.github.Pithos' 99 | //Symbolic Icon Name - 'io.github.Pithos-symbolic' 100 | let possibleIconName = desktopEntry + '-symbolic'; 101 | let currentIconTheme = Gtk.IconTheme.get_default(); 102 | let IconExists = currentIconTheme.has_icon(possibleIconName); 103 | if (IconExists) { 104 | return possibleIconName; 105 | } 106 | } 107 | return fallback || 'audio-x-generic-symbolic'; 108 | } 109 | 110 | function parseMetadata(metadata, state) { 111 | // Pragha sends a metadata dict with one value on stop 112 | if (!metadata || Object.keys(metadata).length < 2) { 113 | metadata = {}; 114 | } 115 | state.trackUrl = metadata["xesam:url"] ? metadata["xesam:url"].unpack() : ""; 116 | state.trackArtist = metadata["xesam:artist"] ? metadata["xesam:artist"].deep_unpack().join('/') : ""; 117 | state.trackArtist = metadata["rhythmbox:streamTitle"] ? metadata["rhythmbox:streamTitle"].unpack() : state.trackArtist; 118 | state.trackAlbum = metadata["xesam:album"] ? metadata["xesam:album"].unpack() : ""; 119 | state.trackTitle = metadata["xesam:title"] ? metadata["xesam:title"].unpack() : ""; 120 | state.trackLength = metadata["mpris:length"] ? Math.round(metadata["mpris:length"].unpack() / 1000000) : 0; 121 | state.trackObj = metadata["mpris:trackid"] ? metadata["mpris:trackid"].unpack() : "/org/mpris/MediaPlayer2/TrackList/NoTrack"; 122 | state.trackCoverUrl = metadata["mpris:artUrl"] ? metadata["mpris:artUrl"].unpack() : ""; 123 | state.trackRating = metadata["xesam:userRating"] ? parseInt(metadata["xesam:userRating"].unpack() * 5) : 'no rating'; 124 | state.trackRating = metadata["pithos:rating"] ? metadata["pithos:rating"].unpack() : state.trackRating; 125 | state.isRhythmboxStream = metadata["rhythmbox:streamTitle"] ? true : false; 126 | } 127 | 128 | var compileTemplate = function(template, playerState) { 129 | let escapedText = template.replace(/{(\w+)\|?([^}]*)}/g, function(match, fieldName, appendText) { 130 | let text = ""; 131 | if (playerState[fieldName] && playerState[fieldName].toString() !== "") { 132 | text = playerState[fieldName].toString() + appendText; 133 | text = GLib.markup_escape_text(text, -1); 134 | } 135 | return text; 136 | }); 137 | //Validate Pango markup. 138 | try { 139 | let validMarkup = Pango.parse_markup(escapedText, -1, '')[0]; 140 | if (!validMarkup) { 141 | escapedText = 'Invalid Syntax'; 142 | } 143 | } 144 | catch(err) { 145 | escapedText = 'Invalid Syntax'; 146 | } 147 | return escapedText; 148 | }; 149 | 150 | var _extends = function(object1, object2) { 151 | Object.getOwnPropertyNames(object2).forEach(function(name, index) { 152 | let desc = Object.getOwnPropertyDescriptor(object2, name); 153 | if (! desc.writable) 154 | Object.defineProperty(object1.prototype, name, desc); 155 | else { 156 | object1.prototype[name] = object2[name]; 157 | } 158 | }); 159 | }; 160 | --------------------------------------------------------------------------------